Ich bin auf der Suche nach einer sauberen Möglichkeit, benutzerdefinierte 404 Fehlerseiten in Spring 4 zurückgegeben, wenn eine angeforderte Ressource nicht gefunden wurde. Abfragen an unterschiedliche Domain-Typen sollten zu unterschiedlichen Fehlerseiten führen.Spring MVC: Wie benutzerdefinierte 404 Fehlerseiten zurückgegeben werden?
Hier einiger Code meine Absicht, zu zeigen (Meter sind eine Domain-Klasse):
@RequestMapping(value = "/{number}", method = RequestMethod.GET)
public String getMeterDetails(@PathVariable("number") final Long number, final Model model) {
final Meter result = meterService.findOne(number);
if (result == null) {
// here some code to return an errorpage
}
model.addAttribute("meter", result);
return "meters/details";
}
ich für den Umgang mit dem Problem mehr Möglichkeiten vorstellen. Erstens würde es die Möglichkeit RuntimeException
s wie
@ResponseStatus(HttpStatus.NOT_FOUND)
public class MeterNotFoundExcption extends RuntimeException { }
und dann verwenden, um einen Exception-Handler erstellen Sie eine benutzerdefinierte Error zu machen (vielleicht einen Link zu einer Liste von Metern oder was auch immer enthält, ist geeignet).
Aber ich mag es nicht, meine Anwendung mit vielen kleinen Ausnahmen zu verschmutzen.
wäre Eine andere Möglichkeit HttpServletResponse
und stellen Sie den Statuscode manuell mit:
@RequestMapping(value = "/{number}", method = RequestMethod.GET)
public String getMeterDetails(@PathVariable("number") final Long number, final Model model,
final HttpServletResponse response) {
final Meter meter = meterService.findOne(number);
if (meter == null) {
response.setStatus(HttpStatus.NOT_FOUND.value());
return "meters/notfound";
}
model.addAttribute("meter", meter);
return "meters/details";
}
Aber mit dieser Lösung habe ich die ersten 5 Zeilen für viele Controller-Methoden (wie Bearbeiten, Löschen) duplizieren.
Gibt es eine elegante Möglichkeit zu verhindern, dass diese Zeilen mehrfach dupliziert werden?
Uh, nein. Dies funktioniert nicht wirklich wie beabsichtigt, da bei einer solchen Ausnahmebehandlung innerhalb des Controllers der HTTP-Status der Antwort, wenn ein "Meter" nicht gefunden wird, immer noch "200" anstelle von "404" ist. Sie zeigen zwar eine nette Seite für den Benutzer, aber der Browser erhält eine Antwort, die anzeigt, dass die Anfrage erfolgreich bearbeitet wurde. –
Danke für Ihren Hinweis. Ich habe meinen Code nochmals überprüft und Sie haben Recht. Die Annotation "ResponseStatus" sollte auf dem Ausnahmebehandler fortgesetzt werden. Ich habe meine Antwort korrigiert. –