Der Frühling der Fastenzeit ist angebrochen!

Spring MVC bietet verschiedene komplementäre Ansätze für die Ausnahmebehandlung, aber wenn ich Spring MVC unterrichte, stelle ich häufig fest, dass meine Schüler verwirrt sind oder sich damit nicht wohl fühlen.

Heute zeige ich Ihnen die verschiedenen Optionen. Unser Ziel ist es, nicht Behandeln Sie Ausnahmen nach Möglichkeit explizit in Controller-Methoden. Sie sind ein Querschnittsthema, das in dediziertem Code besser getrennt behandelt wird.

Es gibt drei Optionen: Pro Ausnahme, pro Controller oder global.

HINWEIS:Die Demo-Anwendungen wurden überarbeitet und aktualisiert (April 2018), um Spring Boot 2.0.1 zu verwenden. Sie sind (hoffentlich) einfacher zu verwenden und zu verstehen. Ich habe auch einige defekte Links behoben (danke für das Feedback, es hat eine Weile gedauert).

Die Zeit des Fastens, der Buße und des Betens wird große Fastenzeit genannt, eine Zeit großer Askese, eines Rufs und einer Aufforderung, wie der Hymnograf sagt: „Das Stadion der Tugenden kommt ans Licht, und Sie können eintreten, um zu trainieren.“

Es gibt viele Themen und viele Erinnerungen an asketische und neptische Theologie über das Fasten und seine Vorteile.
Theodore the Studite (Katechese 33) beschreibt die Fastenzeit als einen Hafen ohne Stürme, in dem alle Menschen reisen und eine spirituelle Gelassenheit genießen.

Die Fastenzeit ist nicht nur eine Ersparniszeit für Mönche und Geistliche, sondern auch für alle Gläubigen jeden Alters. Die Erlösung gehört jedem. Jeder bekommt seinen eigenen Teil, obwohl sein eigener persönlicher Kampf in dieser Zeit.
Dann sagt unser Heiliger, dass die Lehre der Kirche und die Erinnerung an die Geistlichen und Mönche in der Fastenzeit Anregungen und Anweisungen für jeden einzelnen sind, genauso wie diejenigen, die im Stadion kämpfen, die Unterstützung der Mitfasten und mehr brauchen so wie die bildhauer die anmerkungen ihrer lehrer brauchen. Ebenso fördern die Geistlichen die Warenproduktion.

Das Fasten ist mit Freude und Einfachheit zu begrüßen, ohne sich Sorgen um den Entzug bestimmter Nahrungsmittel zu machen.
Während es eine Begeisterung, eine emotionale und psychologische Qualifikation geben mag, die schmerzlos und akzeptabel sein kann, wie es vielen Gläubigen und Geistlichen scheint, weist der Heilige darauf hin, dass Fasten nicht nur körperlich, sondern auch geistlich ist.

Große Fastenzeit bedeutet nicht nur Abstinenz von bestimmten Lebensmitteln, sondern auch jede Abstinenz vom Bösen. Einige Gläubige versuchen, das strengste Fasten zu befolgen, in einer selbstsüchtigen Nachahmung des Fasten der Asketen, und scheitern im Voraus daran, sowohl Nutzen als auch gute Früchte zu erzielen, wenn diese Anstrengung auf Verzweiflung, Trägheit, Eifersucht, Streitigkeiten beruht, die, wie die Schlange, sind in unserem inneren Selbst verborgen.

Die Fastenzeit ist im Frühling, wenn alles blüht, wenn die Früchte auf Bäumen wachsen und die Bauern sie säen.

Auf diesen Feldern wachsen jedoch Dornen, die geschnitten werden müssen.

So sagt der heilige Theodor der Studierende (Katechismus 31), dass unser Körper im Frühling genug Nahrung haben will und verlangt, und wir müssen darauf achten, ihm die notwendige Menge zu geben, da dies die Quelle von Leidenschaften und Sünden ist.

Mit dem Fasten vertreibt unser Körper die Neigung zur Sünde und setzt seine Katharsis fort.

Außerdem sagt uns der Heilige, dass diese Früchte und die Vorteile des Fastens auch dazu dienen, sie zu retten.

Die Heimat der Christen ist Jerusalem und ihr Ziel ist es, das Reich Gottes zu erlangen. Die Früchte des Fastens geben den Christen Vorräte und Güter, um Bürger des Reiches Gottes werden zu können.

Diese Errettung aus der Fastenzeit ist für die Dinge bestimmt, die Gott für sein Reich vorbereitet hat, dh für Dinge und Güter, die niemand gesehen und gehört hat und an die niemand jemals gedacht hat.

Wir müssen uns selbst reinigen, damit wir in dem glückseligen Leben gereinigt werden können, das heißt, bereit zu sein, die Gefäße der Gnade Gottes zu sein. Amen.

Spring Boot

Mit Spring Boot kann ein Spring-Projekt mit einer minimalen Konfiguration eingerichtet werden, und es ist wahrscheinlich, dass Sie es verwenden, wenn Ihre Anwendung weniger als ein paar Jahre alt ist.

Spring MVC bietet standardmäßig keine Fehlerseite (Fallback). Die häufigste Methode zum Festlegen einer Standardfehlerseite war immer der SimpleMappingExceptionResolver (seit Spring V1). Wir werden das später besprechen.

Allerdings Spring Boot tut Bereitstellung einer Fallback-Fehlerbehandlungsseite.

Beim Start versucht Spring Boot, eine Zuordnung für / error zu finden. Eine URL, die auf / error endet, wird standardmäßig einer logischen Ansicht mit dem gleichen Namen zugeordnet: error. In der Demo-Anwendung wird diese Ansicht wiederum der Vorlage error.html Thymeleaf zugeordnet. (Wenn Sie JSP verwenden, wird dies der Datei error.jsp entsprechend dem Setup Ihres InternalResourceViewResolver zugeordnet.) Die tatsächliche Zuordnung hängt davon ab, welchen ViewResolver (falls vorhanden) Sie oder Spring Boot eingerichtet haben.

Wenn keine View-Resolver-Zuordnung für / error gefunden werden kann, definiert Spring Boot eine eigene Fallback-Fehlerseite - die sogenannte "Whitelabel-Fehlerseite" (eine minimale Seite, die nur die HTTP-Statusinformationen und etwaige Fehlerdetails enthält, z die Nachricht von einer nicht erfassten Ausnahme). Wenn Sie in der Beispielanwendung die Vorlage error.html in error2.html umbenennen und dann neu starten, wird sie verwendet.

Wenn Sie eine RESTful-Anfrage stellen (die HTTP-Anfrage hat einen anderen gewünschten Antworttyp als HTML angegeben), gibt Spring Boot eine JSON-Darstellung derselben Fehlerinformationen zurück, die auf der Fehlerseite „Whitelabel“ angezeigt werden.

Spring Boot richtet auch eine Standardfehlerseite für den Container ein, die der entspricht
Direktive in web.xml (obwohl sehr unterschiedlich implementiert). Außerhalb des Spring MVC-Frameworks ausgelöste Ausnahmen, z. B. von einem Servlet-Filter, werden weiterhin auf der Fallback-Fehlerseite für Spring Boot gemeldet. Die Beispielanwendung zeigt auch ein Beispiel dafür.

Eine ausführlichere Beschreibung der Fehlerbehandlung bei Spring Boot finden Sie am Ende dieses Artikels.

Der Rest dieses Artikels gilt unabhängig davon, ob Sie Spring mit oder ohne Spring Boot verwenden.

Ungeduldige REST-Entwickler können direkt zum Abschnitt über benutzerdefinierte REST-Fehlerantworten springen. Sie sollten dann jedoch den vollständigen Artikel lesen, da der Großteil davon für alle Webanwendungen, REST oder auf andere Weise gleichermaßen gilt.

7 Antworten 7

Verwenden Sie stattdessen hasAuthority und hasRole im HTML-Tag.

Ich hatte das gleiche Problem beim Upgrade von Spring Security 3.x auf 4.x. Das Ändern von hasRole () in hasAuthority () hat den Trick für mich getan.

Ihnen fehlt ein Konzept:

  • Wenn Sie hasRole ('ADMIN') verwenden, muss in Ihrer ADMIN-Enumeration ROLE_ADMIN anstelle von ADMIN sein.
  • Wenn Sie hasAuthority ('ADMIN') verwenden, muss Ihre ADMIN-Nummer ADMIN sein.

In der Frühjahrssicherheit ist hasRole () dasselbe wie hasAuthority (), aber die Funktionszuordnung hasRole () mit Authority ohne ROLE_-Präfix.

Ich musste etwas Ähnliches tun, wo ich die Benutzerrolle überprüfen musste. Ich habe unten getan

Hoffe es hilft jemandem.

Ich hatte vor kurzem das gleiche Problem. Was Sie tun müssen, ist:

Fügen Sie in Ihrem HTML-Code die folgenden Anweisungen hinzu:

(Sie können zwischen springsecurity4 und springsecurity3 wechseln, je nachdem, was Sie verwenden.)

Stellen Sie sicher, dass Sie diese Ressource zu Ihren Bibliotheken hinzugefügt haben. Ich benutze gradle, aber du kannst dasselbe mit Maven machen.

Stellen Sie in Ihrer SpringWebConfiguration-Klasse oder XML sicher, dass Sie den Dialekt für thymeleaf SpringSecurity hinzufügen: Ich verwende eine Java-Klasse für die Konfiguration.

Sie können aber auch definieren, wie alexsource sagt: Frühlingssicherheit und Thymeleaf funktionieren nicht

Ich hoffe das klappt bei dir Schöne Grüße!

Kannst du es einfach wie unten ohne das $ <versuchen. >.

Ich glaube, Sie haben den Rollen nicht ROLE_ vorangestellt. Wenn ja, fügen Sie bitte das Präfix wie unten beschrieben hinzu

Ich bin auf dasselbe Problem gestoßen, das an der Frühlingssicherheit 4.0 liegt. Aus irgendeinem Grund ist thymeleaf-extras-springsecurity4 nicht mit spring-security 4.0 und thymeleaf 2.x kompatibel. Also habe ich Spring-Security-Versionen auf 3.2.9.RELEASE heruntergestuft und es hat funktioniert. Wenn Sie weiterhin spring-security 4.0 verwenden möchten, können Sie möglicherweise versuchen, thymeleaf-extras-springsecurity4 auf 3.0.0.RELEASE und thymeleaf verison auf 3.0 zu heben

Oder Wenn Sie die Spring-Boot-App verwenden, wird die Situation schwieriger. Dann bleibt nur noch die Möglichkeit, entweder die Spring-Sicherheit herabzustufen oder die Spring-Boot-Version auf 1.4.x (die noch in BETA enthalten ist) zu aktualisieren.

In Ihrem speziellen Szenario sollten die folgenden Änderungen dazu führen, dass hasRole funktioniert

Verwenden von HTTP-Statuscodes

Normalerweise führt jede nicht behandelte Ausnahme, die bei der Verarbeitung einer Webanforderung ausgelöst wird, dazu, dass der Server eine HTTP 500-Antwort zurückgibt. Jede Ausnahme, die Sie selbst schreiben, kann jedoch mit der Annotation @ResponseStatus (die alle in der HTTP-Spezifikation definierten HTTP-Statuscodes unterstützt) kommentiert werden. Wenn ein kommentiert Eine Ausnahme wird von einer Controllermethode ausgelöst und an keiner anderen Stelle behandelt. Sie bewirkt automatisch, dass die entsprechende HTTP-Antwort mit dem angegebenen Statuscode zurückgegeben wird.

Hier ist zum Beispiel eine Ausnahme für eine fehlende Bestellung.

Und hier ist eine Controller-Methode, die es verwendet:

Eine vertraute HTTP 404-Antwort wird zurückgegeben, wenn die von dieser Methode verarbeitete URL eine unbekannte Auftrags-ID enthält.

Das Lied von Dawning of Spring wird Ihnen von Lyrics-Keeper angeboten

Strophe 1
Ich träumte einen Traum
Von dir und mir
Ich habe geträumt, dass wir
Waren jung
Und in diesem Traum
Wir sind übers Meer gesegelt
In ein Land
Wir liebten

Was für eine wundervolle Szene
Es gab so eine schöne Brise
Alle Erinnerungen waren frei
Und die Vögel, die sie für uns gesungen haben

Da gingen wir mit nackten Füßen
Auf einem Feld am Meer
Es gab nur dich und mich
Keine Anweisungen und kein Grund zur Eile
Keine Eile

Chor
Ich ging verloren, während das Sonnenlicht uns Gold malte
Ich habe mich verlaufen in der Hoffnung, dass wir niemals alt werden würden
Ich habe mich verlaufen, als du mit deiner Hand in meiner Hand gegangen bist
Ich habe mich verlaufen, als du mich gefragt hast, ob ich tanzen möchte
Ich verlor mich im Flüstern der Brise
Ich verlor mich in einem Tagtraum der Stille und des Friedens
Ich habe mich in dem Moment verlaufen, der Raum dazwischen
Ich habe mich verlaufen, ich habe mich in der Dämmerung des Frühlings verlaufen

Vers 2
Wir nahmen Platz
Nur du und ich
In der Sonne liegen

Wir haben geglaubt
Das könnten wir sein
Alles was wir wollen

Wir rannten durch die Bäume zurück
Starrte durch die Blätter
Keine Wolke zu sehen
Und die Vögel sangen immer noch für uns
Für uns singen

Und die Sonne war näher gekommen
Und die Geräusche, die wir hören konnten
Waren so süß und so klar
Und die Welt, die es für uns glänzte
Für uns glänzend


Ich ging verloren, während das Sonnenlicht uns Gold malte
Ich habe mich verlaufen in der Hoffnung, dass wir niemals alt werden würden
Ich habe mich verlaufen, als du mit deiner Hand in meiner Hand gegangen bist
Ich habe mich verlaufen, als du mich gefragt hast, ob ich tanzen möchte
Ich verlor mich im Flüstern der Brise
Ich verlor mich in einem Tagtraum der Stille und des Friedens
Ich habe mich in dem Moment verlaufen, der Raum dazwischen
Ich habe mich verlaufen, ich habe mich im Frühlingsbeginn verlaufen

@ExceptionHandler verwenden

Sie können jedem Controller zusätzliche (@ExceptionHandler) Methoden hinzufügen, um speziell Ausnahmen zu behandeln, die von Methoden zur Anforderungsbehandlung (@RequestMapping) im selben Controller ausgelöst werden. Solche Methoden können:

  1. Ausnahmen ohne die Annotation @ResponseStatus behandeln (normalerweise vordefinierte Ausnahmen, die Sie nicht geschrieben haben)
  2. Leiten Sie den Benutzer zu einer dedizierten Fehleransicht um
  3. Erstellen Sie eine vollständig benutzerdefinierte Fehlerantwort

Der folgende Controller demonstriert diese drei Optionen:

Bei jeder dieser Methoden können Sie sich für eine zusätzliche Verarbeitung entscheiden. Das häufigste Beispiel ist das Protokollieren der Ausnahme.

Handlermethoden verfügen über flexible Signaturen, sodass Sie offensichtliche servletbezogene Objekte wie HttpServletRequest, HttpServletResponse, HttpSession und / oder Principle übergeben können.

Wichtige Notiz: Das Modell kann nicht ein Parameter einer @ ExceptionHandler-Methode sein. Richten Sie stattdessen ein Modell in der Methode mit ModelAndView ein, wie oben in handleError () gezeigt.

Ausnahmen und Ansichten

Seien Sie vorsichtig, wenn Sie dem Modell Ausnahmen hinzufügen. Ihre Benutzer möchten keine Webseiten mit Java-Ausnahmedetails und Stack-Traces sehen. Möglicherweise haben Sie Sicherheitsrichtlinien, die ausdrücklich verbieten Putten irgendein Ausnahmeinformationen auf der Fehlerseite. Ein weiterer Grund, um sicherzustellen, dass Sie die White-Label-Fehlerseite für Spring Boot überschreiben.

Stellen Sie sicher, dass Ausnahmen sinnvoll protokolliert werden, damit sie nach dem Ereignis von Ihren Support- und Entwicklungsteams analysiert werden können.

Bitte denken Sie daran, dass das Folgende praktisch sein kann, aber es ist nicht Best Practice in der Produktion.

Es kann nützlich sein, Ausnahmedetails auf der Seite auszublenden Quelle als Kommentar, um zu helfen testen. Wenn Sie JSP verwenden, können Sie so etwas tun, um die Ausnahme und den entsprechenden Stack-Trace auszugeben (mithilfe eines ausgeblendeten Befehls)

Für das Thymeleaf-Äquivalent siehe support.html in der Demo-Anwendung. Das Ergebnis sieht so aus.

@ControllerAdvice-Klassen verwenden

Mithilfe eines Controller-Hinweises können Sie genau die gleichen Ausnahmebehandlungstechniken verwenden, diese jedoch auf die gesamte Anwendung anwenden, nicht nur auf einen einzelnen Controller. Sie können sich diese als durch Anmerkungen gesteuerten Abfangjäger vorstellen.

Jede mit @ControllerAdvice annotierte Klasse wird zu einem Controller-Hinweis, und drei Arten von Methoden werden unterstützt:

  • Mit @ExceptionHandler annotierte Ausnahmebehandlungsmethoden.
  • Modellverbesserungsmethoden (zum Hinzufügen zusätzlicher Daten zum Modell) mit Anmerkungen versehen mit
    @ModelAttribute. Beachten Sie, dass diese Attribute sind nicht verfügbar für die Ausnahmebehandlungsansichten.
  • Binder-Initialisierungsmethoden (zum Konfigurieren der Formularverarbeitung) mit Anmerkungen versehen mit
    @InitBinder.

Wir werden uns nur mit der Ausnahmebehandlung befassen. Weitere Informationen zu den @ ControllerAdvice-Methoden finden Sie im Online-Handbuch.

Alle oben genannten Ausnahmebehandlungsroutinen können in einer Controller-Hinweisklasse definiert werden. Jetzt gelten sie jedoch für Ausnahmen, die von ausgelöst werden irgendein Regler. Hier ist ein einfaches Beispiel:

Wenn Sie einen Standard-Handler für haben möchten irgendein Ausnahme gibt es eine leichte Falte. Sie müssen sicherstellen, dass mit Anmerkungen versehene Ausnahmen vom Framework behandelt werden. Der Code sieht folgendermaßen aus:

HandlerExceptionResolver

Alle im Anwendungskontext des DispatcherServlet deklarierten Spring Beans, die HandlerExceptionResolver implementieren, werden zum Abfangen und Verarbeiten von Ausnahmen verwendet, die im MVC-System ausgelöst und nicht von einem Controller verarbeitet werden. Das Interface sieht so aus:

Der Handler bezieht sich auf den Controller, der die Ausnahme generiert hat (denken Sie daran, dass @Controller-Instanzen nur ein von Spring MVC unterstützter Handlertyp sind. Beispiel: HttpInvokerExporter und der WebFlow Executor sind ebenfalls Handlertypen).

Hinter den Kulissen erstellt MVC standardmäßig drei solcher Resolver. Es sind diese Resolver, die das oben diskutierte Verhalten implementieren:

  • ExceptionHandlerExceptionResolver vergleicht nicht abgefangene Ausnahmen mit geeigneten @ExceptionHandler-Methoden sowohl auf dem Handler (Controller) als auch auf Controller-Hinweisen.
  • ResponseStatusExceptionResolver sucht nach nicht erfassten Ausnahmen, die von @ResponseStatus mit Anmerkungen versehen wurden (wie in Abschnitt 1 beschrieben).
  • DefaultHandlerExceptionResolver konvertiert Standard-Spring-Ausnahmen und konvertiert sie in HTTP-Statuscodes (ich habe dies oben nicht erwähnt, da es in Spring MVC intern ist).

Diese werden in der angegebenen Reihenfolge verkettet und verarbeitet. Intern erstellt Spring hierfür ein dediziertes Bean (das HandlerExceptionResolverComposite).

Beachten Sie, dass die Methodensignatur von resolveException das Modell nicht enthält. Aus diesem Grund können @ ExceptionHandler-Methoden nicht mit dem Modell injiziert werden.

Sie können auf Wunsch Ihren eigenen HandlerExceptionResolver implementieren, um Ihr eigenes benutzerdefiniertes Ausnahmebehandlungssystem einzurichten. Handler implementieren normalerweise die geordnete Spring-Schnittstelle, sodass Sie die Reihenfolge definieren können, in der die Handler ausgeführt werden.

SimpleMappingExceptionResolver

Spring hat seit langem eine einfache, aber bequeme Implementierung von HandlerExceptionResolver bereitgestellt, die möglicherweise bereits in Ihrer Anwendung verwendet wird - den SimpleMappingExceptionResolver. Es bietet Optionen für:

  • Ordnen Sie Ausnahmeklassennamen den Anzeigenamen zu - geben Sie einfach den Klassennamen an, es wird kein Paket benötigt.
  • Geben Sie eine Standardfehlerseite (Fallback) für jede Ausnahme an, die an keiner anderen Stelle behandelt wird
  • Eine Nachricht protokollieren (dies ist standardmäßig nicht aktiviert).
  • Legen Sie den Namen des Ausnahmeattributs fest, das dem Modell hinzugefügt werden soll, damit es in einer Ansicht verwendet werden kann
    (wie eine JSP). Standardmäßig heißt dieses Attribut Ausnahme. Zum Deaktivieren auf null setzen. Denken Sie daran, dass Ansichten von @ExceptionHandler-Methoden zurückgegeben wurden unterlassen Sie haben Zugriff auf die Ausnahme, aber Ansichten, die für SimpleMappingExceptionResolver definiert sind machen.

Hier ist eine typische Konfiguration unter Verwendung der Java-Konfiguration:

Oder mit XML-Konfiguration:

Das defaultErrorView Diese Eigenschaft ist besonders nützlich, da sie sicherstellt, dass jede nicht abgefangene Ausnahme eine geeignete anwendungsdefinierte Fehlerseite generiert. (Die Standardeinstellung für die meisten Anwendungsserver ist die Anzeige eines Java-Stack-Trace. Dies sollten Ihre Benutzer tun noch nie sehen). Spring Boot bietet mit seiner Fehlerseite „White-Label“ eine weitere Möglichkeit, dasselbe zu tun.

Fehler und REST

RESTful GET-Anforderungen können auch Ausnahmen erzeugen, und wir haben bereits gesehen, wie wir Standard-HTTP-Fehlerantwortcodes zurückgeben können. Was ist jedoch, wenn Sie Informationen zu dem Fehler zurückgeben möchten? Das ist sehr einfach zu machen. Definieren Sie zunächst eine Fehlerklasse:

Jetzt können wir eine Instanz von einem Handler als @ResponseBody wie folgt zurückgeben:

Was ist wann zu verwenden?

Wie immer bietet Ihnen Spring gerne eine Auswahl an. Was sollten Sie also tun? Hier sind einige Faustregeln. Wenn Sie jedoch eine Vorliebe für XML-Konfiguration oder Anmerkungen haben, ist dies auch in Ordnung.

  • Wenn Sie Ausnahmen schreiben, sollten Sie @ResponseStatus hinzufügen.
  • Implementieren Sie für alle anderen Ausnahmen eine @ ExceptionHandler-Methode für eine @ ControllerAdvice-Klasse oder verwenden Sie eine Instanz von SimpleMappingExceptionResolver. Möglicherweise ist SimpleMappingExceptionResolver bereits für Ihre Anwendung konfiguriert. In diesem Fall ist es möglicherweise einfacher, neue Ausnahmeklassen hinzuzufügen, als ein @ControllerAdvice zu implementieren.
  • Fügen Sie für die steuerungsspezifische Ausnahmebehandlung @ExceptionHandler-Methoden zu Ihrer Steuerung hinzu.
  • Warnung: Achten Sie darauf, zu viele dieser Optionen in derselben Anwendung zu mischen. Wenn dieselbe Ausnahme auf mehrere Arten eingereicht werden kann, erhalten Sie möglicherweise nicht das gewünschte Verhalten. @ExceptionHandler-Methoden auf dem Controller werden immer vor denen auf einer @ControllerAdvice-Instanz ausgewählt. Es ist nicht definiert welche Auftragsbearbeiter-Hinweise verarbeitet werden.

Beispielanwendung

Eine Demo-Anwendung finden Sie bei github. Es verwendet Spring Boot und Thymeleaf, um eine einfache Webanwendung zu erstellen.

Die Anwendung wurde zweimal überarbeitet (Oktober 2014, April 2018) und ist (hoffentlich) besser und verständlicher. Die Grundlagen bleiben gleich. Es verwendet Spring Boot V2.0.1 und Spring V5.0.5, aber der Code gilt auch für Spring 3.x und 4.x.

Über die Demo

Die Anwendung führt den Benutzer durch 5 Demoseiten, wobei verschiedene Ausnahmebehandlungstechniken hervorgehoben werden:

  1. Ein Controller mit @ExceptionHandler-Methoden zum Behandeln eigener Ausnahmen
  2. Ein Controller, der Ausnahmen für ein globales ControllerAdvice auslöst, das verarbeitet werden soll
  3. Verwenden eines SimpleMappingExceptionResolver zum Behandeln von Ausnahmen
  4. Wie Demo 3, jedoch mit deaktiviertem SimpleMappingExceptionResolver zum Vergleich
  5. Zeigt an, wie Spring Boot seine Fehlerseite generiert

Eine Beschreibung der wichtigsten Dateien in der Anwendung und deren Beziehung zu jeder Demo finden Sie in der README.md des Projekts.

Die Homepage ist index.html, die:

  • Links zu jeder Demoseite
  • Links (unten auf der Seite) zu Spring Boot-Endpunkten für Interessenten an Spring Boot.

Jede Demoseite enthält mehrere Links, die absichtlich Ausnahmen auslösen. Sie müssen jedes Mal die Zurück-Taste in Ihrem Browser verwenden, um zur Demo-Seite zurückzukehren.

Dank Spring Boot können Sie diese Demo als Java-Anwendung ausführen (es wird ein eingebetteter Tomcat-Container ausgeführt). Zum Ausführen der Anwendung können Sie eine der folgenden Methoden verwenden (die zweite ist dem Spring Boot Maven-Plugin zu verdanken):

Inhalt der Fehlerseite

Auch in der Demoanwendung zeige ich, wie man eine "support-ready" Fehlerseite mit einem in der HTML-Quelle versteckten Stack-Trace erstellt (als Kommentar). Idealerweise sollte der Support diese Informationen aus den Protokollen beziehen, aber das Leben ist nicht immer ideal. Egal, was diese Seite ist tut show zeigt, wie die zugrunde liegende Fehlerbehandlungsmethode handleError ein eigenes ModelAndView erstellt, um zusätzliche Informationen auf der Fehlerseite bereitzustellen. Sehen:

  • ExceptionHandlingController.handleError () auf Github
  • GlobalControllerExceptionHandler.handleError () auf github

Containerweite Ausnahmebehandlung

Außerhalb des Spring Framework ausgelöste Ausnahmen, z. B. von einem Servlet-Filter, werden auch auf der Fallback-Fehlerseite von Spring Boot gemeldet.

Zu diesem Zweck muss Spring Boot eine Standardfehlerseite für den Container registrieren. In Servlet 2 gibt es eine Anweisung, die Sie zu Ihrer web.xml hinzufügen können, um dies zu tun. Leider bietet Servlet 3 keine Java-API-Entsprechung. Stattdessen führt Spring Boot Folgendes aus:

  • Bei einer Jar-Anwendung mit einem eingebetteten Container wird eine Standardfehlerseite mithilfe der container-spezifischen API registriert.
  • Für eine Spring Boot-Anwendung, die als herkömmliche WAR-Datei bereitgestellt wird, wird ein Servlet-Filter verwendet
    Fangen Sie Ausnahmen ab, die weiter unten in der Zeile ausgelöst werden, und behandeln Sie sie.