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 Spring MVC vanille sur Tomcat. Un utilisateur entre une URL non valide dans son navigateur et voit apparaître une trace de pile bleue et blanche pas très conviviale - pas idéale.

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, c'est une excellente façon de commencer.

Cet article se concentre sur Spring MVC. Notre article Personnaliser la page d'erreur Whitelabel décrit comment créer une page d'erreur personnalisée dans Spring Boot.

2. Les étapes simples

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

  1. Spécifiez une URL / des erreurs uniques dans web.xml qui correspondent à 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 / des erreurs
  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 du type «Ressource introuvable», tandis que pour une erreur 500, l'utilisateur devrait voir quelque chose sur les lignes de «Désolé! Une erreur de serveur interne a été générée de notre côté '

3. Le web.xml

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

 /errors 

Notez que cette fonctionnalité n'est disponible que 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 aucun RequestMapping 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 à notre web.xml indiquent à Spring d'exécuter la logique écrite dans la méthode mappée à l'URL / aux erreurs.

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 réellement besoin du web.xml .

4. Le contrôleur

Passant, nous créons maintenant notre ErrorController . Nous créons une méthode unificatrice unique 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 frontal

À 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 fichier jsp appelé errorPage.jsp:

 Home 

6. Test

Nous simulerons deux des erreurs les plus courantes qui se produisent dans n'importe quelle application: l'erreur HTTP 404 et l'erreur HTTP 500.

Exécutez le serveur et dirigez-vous vers localhost: 8080 / spring-mvc-xml / invalidUrl. Puisque cette URL n'existe pas, nous nous attendons à voir notre page d'erreur avec le message « Code d'erreur HTTP: 404. Ressource introuvable».

Voyons ce qui se passe lorsque l'une des méthodes de gestionnaire lève une NullPointerException. Nous ajoutons la méthode suivante à ErrorController:

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

Accédez à localhost: 8080 / spring-mvc-xml / 500Error. Vous devriez voir un écran blanc avec le message «Http Error Code: 500. Internal Server Error».

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é de manière dynamique en fonction du code d'erreur HTTP.