[JAVA] Étendez Spring Boot DefaultErrorViewResolver pour personnaliser dynamiquement les écrans d'erreur

Chose que tu veux faire

Dans le développement d'écran avec Spring Boot + Thymeleaf, je souhaite personnaliser l'écran d'erreur qui s'affiche en fonction du code d'état (4xx, 5xx, etc.) lorsqu'une erreur se produit.

Spring Boot Version 2.1.3.RELEASE

BasicErrorController Pour le développement d'écran avec Spring Boot + Thymeleaf, un point de terminaison est préparé en cas d'erreur. Les classes de contrôleurs qui servent de points de terminaison sont les suivantes.

org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController.java


@Controller
@RequestMapping("${server.error.path:${error.path:/error}}")
public class BasicErrorController extends AbstractErrorController {

Comme décrit dans @RequestMapping (" $ {server.error.path: $ {error.path: / error}} "), entrez "server.error.path" dans application.yaml (properties) pour afficher l'écran d'erreur. Si vous écrivez une URL, cette URL sera le point de terminaison. S'il n'est pas défini, "/ error" sera le point de terminaison par défaut (comme décrit dans $ {error.path: / error}). Par conséquent, même si le développeur ne crée pas de contrôleur d'erreur, l'écran d'erreur peut être affiché simplement en organisant l'écran d'erreur HTML dans la configuration suivante. d.PNG ※http://localhost:8080/error -> 5xx.html ※http://localhost:8080/error/404 -> 4xx.html

Personnalisez dynamiquement l'écran d'erreur

Cependant, dans ce cas, le HTML d'erreur préparé est statique, par exemple, "retirez les informations de connexion de la session et affichez-les dans l'en-tête et le pied de page de l'écran d'erreur" "retirez une certaine valeur de la base de données et de XXX vers l'écran d'erreur Il existe également des demandes de personnalisation dynamique, telles que «affichage activé».

Dans un tel cas, essayez de le développer comme suit. BasicErrorController # resolverErrorView (demande, réponse, état, modèle) appelle resolverErrorView de la classe parente AbstractErrorController et resolver.resolveErrorView (demande, état, modèle) dans ce fichier appelle resolverErrorView de ErrorResolver. Par défaut, le résolveur utilise "org.springframework.boot.autoconfigure.web.servlet.errorDefaultErrorViewResolver", créez donc un résolveur (nommé CustomeErrorViewResolver ici) qui étend cette classe et remplacez la méthode résoudreErrorView ici. Créez un ModelAndView personnalisé dynamiquement et retournez-le. Cela seul permet une personnalisation dynamique.

org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController.java


@RequestMapping(produces = MediaType.TEXT_HTML_VALUE)
public ModelAndView errorHtml(HttpServletRequest request,
		HttpServletResponse response) {
	HttpStatus status = getStatus(request);
	Map<String, Object> model = Collections.unmodifiableMap(getErrorAttributes(
			request, isIncludeStackTrace(request, MediaType.TEXT_HTML)));
	response.setStatus(status.value());
	ModelAndView modelAndView = resolveErrorView(request, response, status, model);
	return (modelAndView != null) ? modelAndView : new ModelAndView("error", model);
}

org.springframework.boot.autoconfigure.web.servlet.error.AbstractErrorController.java


protected ModelAndView resolveErrorView(HttpServletRequest request,
		HttpServletResponse response, HttpStatus status, Map<String, Object> model) {
	for (ErrorViewResolver resolver : this.errorViewResolvers) {
		ModelAndView modelAndView = resolver.resolveErrorView(request, status, model);
		if (modelAndView != null) {
			return modelAndView;
		}
	}
	return null;
}

L'image suivante.

CustomeErrorViewResolver.java


@Component
public class CustomeErrorViewResolver extends DefaultErrorViewResolver {

    /**
     * Create a new {@link DefaultErrorViewResolver} instance.
     * @param applicationContext the source application context
     * @param resourceProperties resource properties
     */
    public CustomeErrorViewResolver(ApplicationContext applicationContext,ResourceProperties resourceProperties) {
        super(applicationContext, resourceProperties);
    }

    @Override
    public ModelAndView resolveErrorView(HttpServletRequest request, HttpStatus status, Map<String, Object> model) {
        final ModelAndView mav = super.resolveErrorView(request, status, model);
        if (status.is4xxClientError()) {
            //Traitement au moment de l'erreur système 4XX
       } else if (status.is5xxServerError()) {
            //Traitement au moment de l'erreur système 5XX
        }
        return mav;
   }
}

c'est tout.

Recommended Posts

Étendez Spring Boot DefaultErrorViewResolver pour personnaliser dynamiquement les écrans d'erreur
Personnalisez la réponse aux erreurs de l'API REST avec Spring Boot (Partie 2)
Personnalisez la réponse aux erreurs de l'API REST avec Spring Boot (Partie 1)
Introduction à Spring Boot ② ~ AOP ~
Introduction à Spring Boot, partie 1
Méthode de résolution d'erreur Spring Boot + PostgreSQL
Comment créer votre propre contrôleur correspondant à / error avec Spring Boot
Comment utiliser ModelMapper (Spring boot)
Mise à niveau de la botte à ressort de la série 1.5 à la série 2.0
Je veux contrôler le message d'erreur par défaut de Spring Boot
[Introduction à Spring Boot] Vérification de la validation du formulaire
Modifications lors de la migration de Spring Boot 1.5 vers Spring Boot 2.0
Modifications lors de la migration de Spring Boot 2.0 vers Spring Boot 2.2
Erreur Javaw.exe lors du démarrage de Spring Boot (STS)
Comment diviser un fichier de message Spring Boot
Ajoutez une botte de printemps et un dégradé à éclipse
[Spring Boot] Comment obtenir des propriétés dynamiquement à partir d'une chaîne contenue dans une URL
Lorsque vous souhaitez notifier une erreur quelque part lors de l'utilisation de graphql-spring-boot avec Spring Boot
Page d'erreur Spring Boot Whitelabel et réponse JSON
Comment utiliser MyBatis2 (iBatis) avec Spring Boot 1.4 (Spring 4)
Comment utiliser h2db intégré avec Spring Boot
Comment réduire l'image de Spring Boot Docker
L'histoire de la montée de la série Spring Boot 1.5 à la série 2.1
Essayez d'implémenter la fonction de connexion avec Spring Boot
Comment ajouter un chemin de classe dans Spring Boot
Introduction à Spring Boot + In-Memory Data Grid
Comment se lier avec un fichier de propriétés dans Spring Boot
Essayez d'automatiser la migration avec Spring Boot Flyway
[Java] Article pour ajouter une validation avec Spring Boot 2.3.1.
Je voulais classer la botte à ressort dans un multi-projet
Appliquer Twitter Bootstrap 4 à Spring Boot 2 à l'aide de Webjars
[Spring Boot] Comment se référer au fichier de propriétés
[Introduction à Spring Boot] Fonction d'authentification avec Spring Security
Spring Boot - Comment définir le délai d'expiration de la session
Personnalisez l'affichage lorsqu'une erreur telle que 404 Not Found se produit dans Spring Boot