Spring Boot: Personnaliser la page d'erreur Whitelabel

1. Vue d'ensemble

Dans cet article, nous allons voir comment désactiver et personnaliser la page d'erreur par défaut pour une application Spring Boot, car une gestion correcte des erreurs illustre le professionnalisme et la qualité du travail.

2. Désactivation de la page d'erreur de marque blanche

Tout d'abord, voyons comment nous pouvons désactiver complètement la page d'erreur en marque blanche, en définissant la propriété server.error.whitelabel.enabled sur false:

server.error.whitelabel.enabled=false

L'ajout de cette entrée au fichier application.properties désactivera la page d'erreur et affichera une page concise qui provient du conteneur d'application sous-jacent, par exemple Tomcat.

Nous pouvons obtenir le même résultat en excluant le bean ErrorMvcAutoConfiguration . Nous pouvons le faire en ajoutant cette entrée au fichier de propriétés:

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration #for Spring Boot 2.0 #spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration

Ou en ajoutant cette annotation à la classe principale:

@EnableAutoConfiguration(exclude = {ErrorMvcAutoConfiguration.class})

Toutes les méthodes mentionnées ci-dessus désactiveront la page d'erreur en marque blanche. Cela nous laisse avec la question de savoir qui gère alors l'erreur?

Eh bien, comme mentionné ci-dessus, il s'agit généralement du conteneur d'application sous-jacent. La bonne chose est que nous pouvons personnaliser davantage les choses en affichant nos pages d'erreur personnalisées au lieu de toutes les valeurs par défaut - c'est l'objet de la section suivante.

3. Affichage des pages d'erreur personnalisées

Nous devons d'abord créer une page d'erreur HTML personnalisée.

Nous enregistrerons le fichier sous le nom error.html puisque nous utilisons le moteur de modèle Thymeleaf :

Our Engineers are on it

Go Home

Si nous sauvegardons ce fichier dans les ressources / modèlesrépertoire, il sera automatiquement récupéré par le BasicErrorController de Spring Boot par défaut .

C'est tout ce dont nous avons besoin pour afficher notre page d'erreur personnalisée. Avec un peu de style, nous aurons maintenant une page d'erreur bien plus jolie pour nos utilisateurs:

Nous pouvons être plus précis en nommant le fichier avec le code d'état HTTP que nous voulons utiliser, par exemple en enregistrant le fichier sous 404.html dans resources / templates / error signifie qu'il sera utilisé explicitement pour les erreurs 404.

3.1. Un ErrorController personnalisé

La limitation jusqu'à présent est que nous ne pouvons pas exécuter de logique personnalisée lorsque des erreurs se produisent. Pour y parvenir, nous devons créer un bean de contrôleur d'erreur qui remplacera celui par défaut.

Pour cela, nous devons créer une classe qui implémente l' interface ErrorController et remplacer sa méthode getErrorPath () pour renvoyer un chemin personnalisé à appeler lorsqu'une erreur se produit.

Cependant, à partir de la version 2.3.x, Spring Boot a déprécié cette méthode et la propriété server.error.path doit être utilisée à la place pour spécifier le chemin personnalisé.

Mais comme il fait toujours partie de l' interface ErrorController et n'a pas été entièrement supprimé, nous devrons le remplacer, sinon le compilateur se plaindra. Pour contourner le problème ici, nous retournons null car il va de toute façon être ignoré:

@Controller public class MyErrorController implements ErrorController { @RequestMapping("/error") public String handleError() { //do something like logging return "error"; } @Override public String getErrorPath() { return null; } }

Dans l'extrait de code ci-dessus, nous annotons également la classe avec @Controller et créons un mappage pour le chemin spécifié en tant que propriété server.error.path:

server.error.path=/error

De cette façon, le contrôleur peut gérer les appels au chemin / error .

Dans handleError () , nous renvoyons la page d'erreur personnalisée que nous avons créée précédemment. Si nous déclenchons une erreur 404 maintenant, c'est notre page personnalisée qui sera affichée.

Améliorons encore handleError () pour afficher des pages d'erreur spécifiques pour différents types d'erreur.

Par exemple, nous pouvons avoir des pages bien conçues spécifiquement pour les types d'erreur 404 et 500. Ensuite, nous pouvons utiliser le code d'état HTTP de l'erreur pour déterminer une page d'erreur appropriée à afficher:

@RequestMapping("/error") public String handleError(HttpServletRequest request) { Object status = request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE); if (status != null) { Integer statusCode = Integer.valueOf(status.toString()); if(statusCode == HttpStatus.NOT_FOUND.value()) { return "error-404"; } else if(statusCode == HttpStatus.INTERNAL_SERVER_ERROR.value()) { return "error-500"; } } return "error"; }

Ensuite, pour une erreur 404, par exemple, nous verrons la page error-404.html :

4. Conclusion

Avec ces informations, nous pouvons désormais gérer les erreurs avec plus d'élégance et montrer à nos utilisateurs une page esthétique.

Comme toujours, le code source complet est disponible sur Github.