Pages d’erreur personnalisées avec Spring MVC

Pages d'erreur personnalisées avec Spring MVC

1. Vue d'ensemble

Les pages d'erreur personnalisées sont une exigence courante dans toute application Web.

Par exemple, supposons que vous exécutiez une application vanilla Spring MVC sur Tomcat. Un utilisateur entre une URL non valide dans son navigateur et une trace de pile bleue et blanche pas très conviviale s’affiche, ce qui n’est pas idéal.

Dans ce didacticiel, nous allons configurer des pages d'erreur personnalisées pour quelques codes d'erreur HTTP.

L'hypothèse de travail est que le lecteur est assez à l'aise avec Spring MVC; sinon,this is a great way to start.

2. Les étapes simples

Commençons par les étapes simples que nous allons suivre ici:

  1. Spécifiez une seule URL/errors dansweb.xml qui correspond à une méthode qui gérerait l'erreur chaque fois qu'une erreur est générée

  2. Créez un contrôleur appeléErrorController avec un mappage/errors

  3. Déterminez le code d'erreur HTTP au moment de l'exécution et affichez un message en fonction du code d'erreur HTTP. Par exemple, si une erreur 404 est générée, l'utilisateur devrait voir un message comme‘Resource not found' , alors que pour un 500 erreur, l'utilisateur devrait voir quelque chose sur les lignes de‘Sorry! An Internal Server Error was generated at our end'

3. Lesweb.xml

Nous commençons par ajouter les lignes suivantes à nosweb.xml:


    /errors

Notez que cette fonctionnalité est uniquement disponible dans les versions de servlet supérieures à 3.0.

Toute erreur générée dans une application est associée à un code d'erreur HTTP. Par exemple, supposons qu'un utilisateur entre une URL/invalidUrl dans le navigateur, mais qu'aucunRequestMapping n'a été défini dans Spring. Ensuite, un code HTTP de 404 généré par le serveur Web sous-jacent. Les lignes que nous venons d'ajouter à notreweb.xml indiquent à Spring d'exécuter la logique écrite dans la méthode mappée à l'URL/errors.

Une petite remarque ici - la configuration de Java Servlet correspondante n'a malheureusement pas d'API pour définir la page d'erreur - donc dans ce cas, nous avons en fait besoin desweb.xml.

4. Le controlle

Passant, nous créons maintenant nosErrorController. Nous créons une seule méthode unificatrice qui intercepte l'erreur et affiche une page d'erreur:

@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. Le Front-End

À des fins de démonstration, nous garderons notre page d’erreur très simple et compacte. Cette page ne contiendra qu'un message affiché sur un écran blanc. Créez un fichierjsp appeléerrorPage.jsp :

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


    Home


    

${errorMsg}

6. Essai

Nous allons simuler deux des erreurs les plus courantes qui se produisent dans une application: l'erreur HTTP 404 et l'erreur HTTP 500.

Exécutez le serveur et dirigez-vous verslocalhost:8080/spring-mvc-xml/invalidUrl. Puisque cette URL n'existe pas, nous nous attendons à voir notre page d'erreur avec le message «Http Error Code : 404. Resource not found'.

Voyons ce qui se passe quand l’une des méthodes de gestion lève unNullPointerException. Nous ajoutons la méthode suivante àErrorController:

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

Passez àlocalhost:8080/spring-mvc-xml/500Error. Vous devriez voir un écran blanc avec le message «Http Error Code: 500. Erreur Interne du Serveur'.

7. Conclusion

Nous avons vu comment configurer des pages d'erreur pour différents codes HTTP avec Spring MVC. Nous avons créé une page d'erreur unique où un message d'erreur est affiché dynamiquement en fonction du code d'erreur HTTP.