Benutzerdefinierte Fehlerseiten mit Spring MVC

Benutzerdefinierte Fehlerseiten mit Spring MVC

1. Überblick

Eine häufige Anforderung in jeder Webanwendung sind angepasste Fehlerseiten.

Angenommen, Sie führen eine Vanilla Spring MVC-App auf Tomcat aus. Ein Benutzer gibt eine ungültige URL in seinen Browser ein und es wird eine nicht so benutzerfreundliche blau-weiße Stapelspur angezeigt - nicht ideal.

In diesem Tutorial richten wir benutzerdefinierte Fehlerseiten für einige HTTP-Fehlercodes ein.

Die Arbeitsannahme ist, dass der Leser mit Spring MVC ziemlich vertraut ist. wenn nicht,this is a great way to start.

2. Die einfachen Schritte

Beginnen wir mit den einfachen Schritten, die wir hier ausführen werden:

  1. Geben Sie eine einzelne URL/errors inweb.xml an, die einer Methode zugeordnet ist, die den Fehler behandelt, wenn ein Fehler generiert wird

  2. Erstellen Sie einen Controller mit dem NamenErrorController mit einem Mapping/errors

  3. Ermitteln Sie zur Laufzeit den HTTP-Fehlercode und zeigen Sie eine Nachricht gemäß dem HTTP-Fehlercode. an. Wenn beispielsweise ein 404-Fehler generiert wird, sollte der Benutzer eine Nachricht wie‘Resource not found' , sehen, während dies bei einem 500 der Fall ist Fehler sollte der Benutzer etwas in den Zeilen von‘Sorry! An Internal Server Error was generated at our end' sehen

3. Dieweb.xml

Wir beginnen mit dem Hinzufügen der folgenden Zeilen zu unserenweb.xml:


    /errors

Beachten Sie, dass diese Funktion nur in Servlet-Versionen größer als 3.0 verfügbar ist.

Jeder in einer App erzeugte Fehler ist mit einem HTTP-Fehlercode verknüpft. Angenommen, ein Benutzer gibt eine URL/invalidUrl in den Browser ein, in Spring wurden jedoch keine solchenRequestMapping definiert. Dann wird ein HTTP-Code von 404 vom zugrunde liegenden Webserver generiert. Die Zeilen, die wir gerade zu unserenweb.xml hinzugefügt haben, weisen Spring an, die in der Methode geschriebene Logik auszuführen, die der URL/errors. zugeordnet ist

Eine kurze Randnotiz hier - die entsprechende Java-Servlet-Konfiguration verfügt leider nicht über eine API zum Festlegen der Fehlerseite - in diesem Fall benötigen wir also tatsächlich dieweb.xml.

4. Der Controller

Im weiteren Verlauf erstellen wir jetzt unsereErrorController. Wir erstellen eine einzige vereinheitlichende Methode, die den Fehler abfängt und eine Fehlerseite anzeigt:

@Controller
public class ErrorController {

    @RequestMapping(value = "errors", method = RequestMethod.GET)
    public ModelAndView renderErrorPage(HttpServletRequest httpRequest) {

        ModelAndView errorPage = new ModelAndView("errorPage");
        String errorMsg = "";
        int httpErrorCode = getErrorCode(httpRequest);

        switch (httpErrorCode) {
            case 400: {
                errorMsg = "Http Error Code: 400. Bad Request";
                break;
            }
            case 401: {
                errorMsg = "Http Error Code: 401. Unauthorized";
                break;
            }
            case 404: {
                errorMsg = "Http Error Code: 404. Resource not found";
                break;
            }
            case 500: {
                errorMsg = "Http Error Code: 500. Internal Server Error";
                break;
            }
        }
        errorPage.addObject("errorMsg", errorMsg);
        return errorPage;
    }

    private int getErrorCode(HttpServletRequest httpRequest) {
        return (Integer) httpRequest
          .getAttribute("javax.servlet.error.status_code");
    }
}

5. Das Frontend

Zu Demonstrationszwecken halten wir unsere Fehlerseite sehr einfach und kompakt. Diese Seite enthält nur eine Meldung, die auf einem weißen Bildschirm angezeigt wird. Erstellen Sie einejsp-Datei mit dem NamenerrorPage.jsp :

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ page session="false"%>


    Home


    

${errorMsg}

6. Testen

Wir simulieren zwei der häufigsten Fehler, die in einer Anwendung auftreten: den HTTP 404-Fehler und den HTTP 500-Fehler.

Führen Sie den Server aus und gehen Sie zulocalhost:8080/spring-mvc-xml/invalidUrl.. Da diese URL nicht vorhanden ist, wird unsere Fehlerseite mit der Meldung "Http Error Code : 404. Resource not found'." angezeigt

Mal sehen, was passiert, wenn eine der Handler-MethodenNullPointerException. auslöst. Wir fügenErrorController: die folgende Methode hinzu

@RequestMapping(value = "500Error", method = RequestMethod.GET)
public void throwRuntimeException() {
    throw new NullPointerException("Throwing a null pointer exception");
}

Gehen Sie zulocalhost:8080/spring-mvc-xml/500Error.. Es sollte ein weißer Bildschirm mit der Meldung „HTTP-Fehlercode: 500. Interner Serverfehler'.

7. Fazit

Wir haben gesehen, wie Fehlerseiten für verschiedene HTTP-Codes mit Spring MVC.eingerichtet werden. Wir haben eine einzelne Fehlerseite erstellt, auf der eine Fehlermeldung dynamisch gemäß dem HTTP-Fehlercode angezeigt wird.