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.
※http://localhost:8080/error -> 5xx.html
※http://localhost:8080/error/404 -> 4xx.html
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