Bei der Bildschirmentwicklung mit Spring Boot + Thymeleaf möchte ich den Fehlerbildschirm anpassen, der bei Auftreten eines Fehlers gemäß dem Statuscode (4xx, 5xx usw.) angezeigt wird.
Spring Boot Version 2.1.3.RELEASE
BasicErrorController Die Bildschirmentwicklung mit Spring Boot + Thymeleaf hat einen Endpunkt für den Fall, dass ein Fehler auftritt. Die Controller-Klassen, die als Endpunkte dienen, lauten wie folgt.
org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController.java
@Controller
@RequestMapping("${server.error.path:${error.path:/error}}")
public class BasicErrorController extends AbstractErrorController {
Geben Sie wie in "@RequestMapping (" $ {server.error.path: $ {error.path: / error}} ")" server.error.path "in application.yaml (Eigenschaften) ein, um den Fehlerbildschirm anzuzeigen. Wenn Sie eine URL schreiben, ist diese URL der Endpunkt. Wenn nicht festgelegt, ist "/ error" standardmäßig der Endpunkt (wie in $ {error.path: / error} beschrieben). Selbst wenn der Entwickler keinen Fehlercontroller erstellt, kann der Fehlerbildschirm einfach angezeigt werden, indem der HTML-Code des Fehlerbildschirms in der folgenden Konfiguration angeordnet wird. ※http://localhost:8080/error -> 5xx.html ※http://localhost:8080/error/404 -> 4xx.html
In diesem Fall ist der vorbereitete Fehler-HTML-Code jedoch statisch. Nehmen Sie beispielsweise "die Anmeldeinformationen aus der Sitzung heraus und zeigen Sie sie in der Kopf- und Fußzeile des Fehlerbildschirms an" "einen bestimmten Wert aus der Datenbank und XXX ihn in den Fehlerbildschirm Es gibt auch Anforderungen für eine dynamische Anpassung, z. B. "Anzeige ein".
Versuchen Sie in einem solchen Fall, es wie folgt zu erweitern. BasicErrorController # resolveErrorView (Anforderung, Antwort, Status, Modell) ruft auflöseErrorView der übergeordneten Klasse AbstractErrorController auf, und resolver.resolveErrorView (Anforderung, Status, Modell) ruft in dieser die Auflösungsfehleransicht von ErrorResolver auf. Standardmäßig verwendet der Resolver "org.springframework.boot.autoconfigure.web.servlet.errorDefaultErrorViewResolver". Erstellen Sie daher einen Resolver (hier CustomeErrorViewResolver), der diese Klasse erweitert, und überschreiben Sie dort die Methode "resolveErrorView". Erstellen Sie ein dynamisch angepasstes ModelAndView und kehren Sie zurück. Dies allein ermöglicht eine dynamische Anpassung.
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;
}
Das folgende Bild.
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()) {
//Verarbeitung zum Zeitpunkt des 4XX-Systemfehlers
} else if (status.is5xxServerError()) {
//Verarbeitung zum Zeitpunkt des 5XX-Systemfehlers
}
return mav;
}
}
das ist alles.
Recommended Posts