Wie priorisiert der Server, welche Art von web.xml-Fehlerseite zu verwenden ist?

8

Ich habe zwei Fehlerseiten; 1 ist für SpecificExceptionA und das andere ist für Throwable.

%Vor%

Wenn ich beides in meiner web.xml definiert habe, geht alles nach /error/error.jsp.

Wenn ich nur die spezifische Ausnahme definiert habe, geht es auf die richtige Seite; aber andere Fehler gehen zum Tomcat-Standard (außer 404)

Gibt es eine bessere Möglichkeit, bestimmte Ausnahmehandler anzugeben? Ich benutze Frühling 3.0.

    
Zee Spencer 14.03.2011, 13:26
quelle

2 Antworten

10

Dies ist nicht spezifisch für Tomcat. Dies ist spezifisch für die Servlet-API. Wie die Fehlerseite ermittelt wird, ist in Kapitel 9.9.2 der Servlet-API-Spezifikation 2.5 angegeben. Hier ist ein Auszug von Relevanz:

  

SRV.9.9.2 Fehlerseiten

     

Wenn keine error-page -Deklaration, die ein exception-type enthält, zur Verwendung des   Klassenhierarchie-Übereinstimmung, und die ausgelöste Ausnahme ist ServletException oder   Unterklasse davon extrahiert der Container die umgebrochene Ausnahme, wie durch definiert   die Methode ServletException.getRootCause . Ein zweiter Durchlauf wird über den Fehler gemacht   Seitendeklarationen versuchen erneut die Übereinstimmung mit der Fehlerseite   Deklarationen, sondern stattdessen die Wrapped-Exception.

Also wurde Ihre SpecificExceptionA wahrscheinlich in eine ServletException und somit ist java.lang.Throwable die beste Übereinstimmung im 1. Durchgang. Wenn Sie diesen Eintrag entfernen, wird ein zweiter Durchgang mit der eingepackten Ausnahme durchgeführt, und Ihre SpecificExceptionA erhalten eine Übereinstimmung.

Der richtige Weg, um eine allgemeine HTTP 500-Fehlerseite zu definieren, besteht darin, sie auf error-code anstelle von exception-type :

zu mappen %Vor%

Wenn dies aus einem unklaren Grund keine Option ist, besteht eine der Möglichkeiten zur Umgehung darin, ein Filter zu erstellen, das auf einem url-pattern von /* lauscht und im Wesentlichen Folgendes ausführt:

%Vor%

Es muss nur von RuntimeException erweitert werden, damit es funktioniert.

    
BalusC 14.03.2011, 13:51
quelle
1

Ich habe die Springs SimpleMappingExceptionResolver-Klasse verwendet

%Vor%     
Zee Spencer 14.03.2011 14:08
quelle