Jakarta EE Servlet Ausnahmebehandlung

1. Einleitung

In diesem Lernprogramm werden Ausnahmen in einer Jakarta EE-Servlet-Anwendung behandelt, um bei jedem Fehler ein ordnungsgemäßes und erwartetes Ergebnis zu erzielen.

2. Jakarta EE Servlet Ausnahmen

Zuerst definieren wir ein Servlet mithilfe der API-Annotationen (weitere Informationen finden Sie im Servlets-Intro) mit einem Standard- GET- Prozessor, der eine Ausnahme auslöst:

@WebServlet(urlPatterns = "/randomError") public class RandomErrorServlet extends HttpServlet { @Override protected void doGet( HttpServletRequest req, HttpServletResponse resp) { throw new IllegalStateException("Random error"); } }

3. Standardfehlerbehandlung

Stellen wir die Anwendung jetzt einfach in unserem Servlet-Container bereit (wir gehen davon aus, dass die Anwendung unter // localhost: 8080 / javax-servlets ausgeführt wird ).

Wenn wir auf die Adresse // localhost: 8080 / javax-servlets / randomError zugreifen , wird die Standardbehandlung für Servletfehler angezeigt:

Die Standardfehlerbehandlung wird vom Servlet-Container bereitgestellt und kann auf Container- oder Anwendungsebene angepasst werden.

4. Benutzerdefinierte Fehlerbehandlung

Wir können die benutzerdefinierte Fehlerbehandlung mithilfe eines web.xml- Dateideskriptors definieren, in dem wir die folgenden Arten von Richtlinien definieren können:

  • Statuscode-Fehlerbehandlung - Ermöglicht die Zuordnung von HTTP-Fehlercodes (Client und Server) zu einer statischen HTML-Fehlerseite oder einem Fehlerbehandlungsservlet
  • Fehlerbehandlung für Ausnahmetypen - Ermöglicht die Zuordnung von Ausnahmetypen zu statischen HTML-Fehlerseiten oder einem Servlet zur Fehlerbehandlung

4.1. Statuscode-Fehlerbehandlung mit einer HTML-Seite

Wir können unsere benutzerdefinierte Fehlerbehandlungsrichtlinie für HTTP 404-Fehler in der Datei web.xml einrichten :

  404 /error-404.html    

Greifen Sie jetzt über den Browser auf //localhost:8080/javax-servlets/invalid.html zu, um die statische HTML-Fehlerseite abzurufen .

4.2. Ausnahmetyp Fehlerbehandlung mit einem Servlet

Wir können unsere benutzerdefinierte Fehlerbehandlungsrichtlinie für java.lang.Exception in web.xml einrichten :

  java.lang.Exception /errorHandler  

In ErrorHandlerServlet können wir mithilfe der in der Anforderung angegebenen Fehlerattribute auf die Fehlerdetails zugreifen:

@WebServlet(urlPatterns = "/errorHandler") public class ErrorHandlerServlet extends HttpServlet { @Override protected void doGet( HttpServletRequest req, HttpServletResponse resp) throws IOException { resp.setContentType("text/html; charset=utf-8"); try (PrintWriter writer = resp.getWriter()) { writer.write("Error description"); writer.write("

Error description

"); writer.write("
    "); Arrays.asList( ERROR_STATUS_CODE, ERROR_EXCEPTION_TYPE, ERROR_MESSAGE) .forEach(e -> writer.write("
  • " + e + ":" + req.getAttribute(e) + "
  • ") ); writer.write("
"); writer.write(""); } } }

Jetzt können wir auf // localhost: 8080 / javax-servlets / randomError zugreifen, um zu sehen, wie das benutzerdefinierte Fehlerservlet funktioniert.

Hinweis : Unser in der Datei web.xml definierter Ausnahmetyp ist zu weit gefasst und wir sollten alle Ausnahmen, die wir behandeln möchten, genauer angeben.

Wir können auch den vom Container bereitgestellten Servlet-Logger in unserer ErrorHandlerServlet- Komponente verwenden, um zusätzliche Details zu protokollieren:

Exception exception = (Exception) req.getAttribute(ERROR_EXCEPTION); if (IllegalArgumentException.class.isInstance(exception)) { getServletContext() .log("Error on an application argument", exception); }

Es lohnt sich zu wissen, was über die von Servlets bereitgestellten Protokollierungsmechanismen hinausgeht. Weitere Informationen finden Sie in der Anleitung auf slf4j.

5. Schlussfolgerung

In diesem kurzen Artikel haben wir die Standardfehlerbehandlung und die angegebene benutzerdefinierte Fehlerbehandlung in einer Servlet-Anwendung gesehen, ohne externe Komponenten oder Bibliotheken hinzuzufügen.

Wie immer finden Sie den Quellcode im Servlets-Tutorial-Repository.