Spring Boot: Personnaliser la page d’erreur Whitelabel

Spring Boot: Personnalisation de la page d'erreur Whitelabel

1. Vue d'ensemble

Dans cet article, nous allons voir commentdisable and customize the default error page for a Spring Boot application car la gestion correcte des erreurs illustre le professionnalisme et la qualité du travail.

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

Voyons d'abord comment désactiver complètement la page d'erreur en marque blanche en définissant la propriétéserver.error.whitelabel.enabled surfalse:

server.error.whitelabel.enabled=false

L'ajout de cette entrée au fichier application.properties désactive la page d'erreur et affiche une page concise provenant du conteneur d'applications sous-jacent, par exemple, Tomcat.

We can achieve the same result by excluding the ErrorMvcAutoConfiguration bean. 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ésactivent la page d'erreur en marque blanche. Cela nous laisse avec la question de savoir qui gère alors réellement 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 à la place 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.

We’ll save the file as error.html puisque nous utilisons le moteur de modèleThymeleaf :




Something went wrong!

Our Engineers are on it

Go Home

If we save this file in resources/templates directory, it’ll automatically be picked up par leBasicErrorController 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 allons maintenant avoir une page d'erreur bien plus jolie pour nos utilisateurs:

 

Spring Boot Custom Error Page

Nous pouvons être plus spécifiques en nommant le fichier avec le code de statut HTTP que nous voulons utiliser, par exemple. l'enregistrement du fichier sous404.html dansresources/templates/error signifie qu'il sera utilisé explicitement pour les erreurs 404.

3.1. UnErrorController 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,we have to create a class that implements the ErrorController interface et remplace songetErrorPath() t pour renvoyer un chemin personnalisé à appeler lorsqu'une erreur s'est produite:

@Controller
public class MyErrorController implements ErrorController  {

    @RequestMapping("/error")
    public String handleError() {
        //do something like logging
        return "error";
    }

    @Override
    public String getErrorPath() {
        return "/error";
    }
}

Dans l'extrait de code ci-dessus, nous annotons également la classe avec@Controller et créons un mappage pour le chemin renvoyé par lesgetErrorPath(). De cette façon, le contrôleur peut gérer les appels au chemin/error.

Dans leshandleError(), 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 s'affichera.

Améliorons encore leshandleError() 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 pageerror-404.html:

image

4. Conclusion

Avec cette information, nous pouvons maintenant gérer les erreurs avec plus d’élégance et montrer à nos utilisateurs une page esthétique.

Comme toujours, le code source complet est disponibleover on Github.