Wie behandeln Ausnahmen in Spring MVC anders für HTML- und JSON-Anforderungen
Ich bin mit der folgenden exception-handler im Frühjahr 4.0.3 zum abfangen von Ausnahmen und zeigt eine benutzerdefinierte Fehlerseite für den Benutzer:
@ControllerAdvice
public class ExceptionHandlerController
{
@ExceptionHandler(value = Exception.class)
public ModelAndView handleError(HttpServletRequest request, Exception e)
{
ModelAndView mav = new ModelAndView("/errors/500"));
mav.addObject("exception", e);
return mav;
}
}
Aber jetzt will ich eine andere Handhabung für die JSON-Anfragen, so bekomme ich JSON-Fehler-Antworten für diese Art von Anfragen, wenn eine Ausnahme aufgetreten ist. Derzeit ist der obige code wird auch ausgelöst durch die JSON-Anfragen (Mit einer Accept: application/json
- header) und den JavaScript-client nicht wie die HTML-Antwort.
Wie kann ich Ausnahmen anders für HTML-und JSON-requests?
InformationsquelleAutor der Frage kayahr | 2014-05-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den ControllerAdvice annotation ist ein element/Attribut namens basePackage, die gesetzt werden können, um zu bestimmen, welche Pakete sollte es scan-Controllern und anwenden der Tipps. Also, was Sie tun können, ist zu getrennten Controllern Umgang mit normalen Wünsche und die Handhabung von AJAX-requests in verschiedenen Paketen, dann schreiben 2-Exception Handling-Controller mit entsprechenden ControllerAdvice Anmerkungen. Zum Beispiel:
InformationsquelleAutor der Antwort dnang
Der beste Weg, dies zu tun (vor allem in der servlet 3) zu registrieren, wird eine Fehlerseite mit dem container, und verwenden Sie diese zum aufrufen einer Feder
@Controller
. So erhalten Sie für den Umgang mit verschiedenen Antwort-Typen in einem standard-Spring MVC Art und Weise (z.B. mit@RequestMapping
mit produziert=... für Ihre Maschine-clients).Ich sehe aus Ihrer Frage, dass Sie mit Spring Boot. Wenn Sie ein upgrade auf eine Momentaufnahme (1.1 oder besser in anderen Worten) Sie erhalten dieses Verhalten aus der box (siehe
BasicErrorController
). Wenn Sie möchten, um es zu überschreiben, die Sie gerade brauchen, um anzeigen /Fehler-Pfad zu Ihrem eigenen@Controller
.InformationsquelleAutor der Antwort Dave Syer
Haben Sie das HttpServletRequest, Sie sollten in der Lage sein, um die Anforderung "Accept" - header. Dann könnten Sie verarbeiten die Ausnahme.
Etwas wie:
InformationsquelleAutor der Antwort Daniel
Da ich nicht finden, eine Lösung für dieses, ich schrieb einige code, der manuell überprüft die
accept
- header der Anfrage um deren format zu bestimmen. Ich habe dann überprüfen, ob der Benutzer angemeldet ist und entweder senden Sie die kompletten stacktrace, wenn er oder eine kurze Fehlermeldung.Benutze ich ResponseEntity zurückkehren können sowohl JSON oder HTML wie hier.
Code:
InformationsquelleAutor der Antwort Katharsas
Den controlleradvice Anmerkung hat mehrere Eigenschaften, die festgelegt werden können, seit dem Frühjahr 4. Sie können definieren mehrere controller Ratschläge, die unterschiedliche Regeln anwenden.
Einer Eigenschaft ist " - Anmerkungen. Wahrscheinlich können Sie eine bestimmte Anmerkung auf das json-request-mapping oder vielleicht finden Sie eine andere Eigenschaft nützlich?
InformationsquelleAutor der Antwort Martin Frey
@ControllerAdvice
Lassen Sie die exception-handler senden DTO enthält das Feld Fehler.
Dieser code ist von dieser website:http://www.petrikainulainen.net/programming/spring-framework/spring-from-the-trenches-adding-validation-to-a-rest-api/
Schauen Sie dort für mehr info.
InformationsquelleAutor der Antwort Michiel
Der trick ist zu haben, eine REST-controller mit zwei Zuordnungen, von denen gibt
"text/html"
und gibt einen gültigen HTML-Quelltext. Das Beispiel unten, in der getestet wurde, in Spring Boot 2.0nimmt die Existenz einer separaten Vorlage mit dem Namen"error.html"
.Referenzen
InformationsquelleAutor der Antwort nobar