Gestion des exceptions de servlet Jakarta EE

1. Introduction

Dans ce tutoriel, nous allons gérer les exceptions dans une application Jakarta EE Servlet - afin de fournir un résultat normal et attendu chaque fois qu'une erreur se produit.

2. Exceptions du servlet Jakarta EE

Tout d'abord, nous allons définir un servlet à l'aide des annotations de l'API (jetez un œil à l'intro des servlets pour plus de détails) avec un processeur GET par défaut qui lèvera une exception:

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

3. Gestion des erreurs par défaut

Déployons maintenant simplement l'application dans notre conteneur de servlets (nous allons supposer que l'application s'exécute sous // localhost: 8080 / javax-servlets ).

Lorsque nous accédons à l'adresse // localhost: 8080 / javax-servlets / randomError , nous verrons la gestion des erreurs de servlet par défaut en place:

La gestion des erreurs par défaut est fournie par le conteneur de servlet et peut être personnalisée au niveau du conteneur ou de l'application.

4. Gestion des erreurs personnalisée

Nous pouvons définir la gestion des erreurs personnalisée à l'aide d'un descripteur de fichier web.xml dans lequel nous pouvons définir les types de politiques suivants:

  • Gestion des erreurs de code d'état - cela nous permet de mapper les codes d'erreur HTTP (client et serveur) à une page d'erreur HTML statique ou à un servlet de gestion des erreurs
  • Gestion des erreurs de type d'exception - cela nous permet de mapper les types d'exception à des pages d'erreur HTML statiques ou à un servlet de gestion des erreurs

4.1. Gestion des erreurs de code d'état avec une page HTML

Nous pouvons configurer notre politique de gestion des erreurs personnalisée pour les erreurs HTTP 404 dans le fichier web.xml :

  404 /error-404.html    

Maintenant, accédez à //localhost:8080/javax-servlets/invalid.html depuis le navigateur - pour obtenir la page d'erreur HTML statique.

4.2. Gestion des erreurs de type exception avec un servlet

Nous pouvons configurer notre politique de gestion des erreurs personnalisée pour java.lang.Exception dans web.xml :

  java.lang.Exception /errorHandler  

Dans ErrorHandlerServlet , nous pouvons accéder aux détails de l'erreur à l'aide des attributs d'erreur fournis dans la demande:

@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(""); } } }

Maintenant, nous pouvons accéder à // localhost: 8080 / javax-servlets / randomError pour voir le servlet d'erreur personnalisé fonctionner.

Remarque : notre type d'exception défini dans le fichier web.xml est trop large et nous devons spécifier toutes les exceptions que nous voulons traiter plus en détail.

Nous pouvons également utiliser le journal de servlet fourni par le conteneur dans notre composant ErrorHandlerServlet pour consigner des détails supplémentaires:

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

Cela vaut la peine de savoir ce qui va au-delà des mécanismes de journalisation fournis par les servlets, consultez le guide sur slf4j pour plus de détails.

5. Conclusion

Dans ce bref article, nous avons vu la gestion des erreurs par défaut et la gestion des erreurs personnalisée spécifiée dans une application de servlet sans ajouter de composants externes ni de bibliothèques.

Comme toujours, vous pouvez trouver le code source sur le référentiel du didacticiel Servlets.