Gestion des exceptions de servlet Java EE

Gestion des exceptions de servlet Java EE

1. introduction

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

2. Exceptions aux servlets Java EE

Tout d'abord, nous allons définir un servlet en utilisant leAPI annotations (regardez leServlets Intro pour plus de détails) avec un processeurGET 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. Traitement des erreurs par défaut

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

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

image

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

4. Gestion personnalisée des erreurs

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

  • Status code error handling - cela nous permet de mapper les codes d'erreur HTTP (client etserver) à une page d'erreur HTML statique ou à un servlet de gestion des erreurs

  • Exception type error handling - cela nous permet de mapper les types d'exceptions aux pages d'erreur HTML statiques ou à un servlet de gestion des erreurs

4.1. Status Code Error Handling avec une page HTML

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



    
        404
        /error-404.html 
    

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

4.2. Traitement des erreurs de type d'exception avec un servlet

Nous pouvons configurer notre politique de gestion des erreurs personnalisée pourjava.lang.Exception dansweb.xml:


    
        java.lang.Exception
        /errorHandler
    

DansErrorHandlerServlet, nous pouvons accéder aux détails de l'erreur en utilisant leserror attributes fournis dans la requête:

@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 àhttp://localhost:8080/javax-servlets/randomError pour voir le servlet d'erreur personnalisé fonctionner.

Note: Notre type d'exception défini dans lesweb.xml est trop large et nous devons spécifier toutes les exceptions que nous voulons traiter plus en détail.

Nous pouvons également utiliser lescontainer-provided servlet logger dans notre composantErrorHandlerServlet pour enregistrer 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, vérifiez lesguide on slf4j pour plus de détails.

5. Conclusion

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

Comme toujours, vous pouvez trouver le code source surServlets tutorial repository.