[JAVA] Erweitern Sie Spring Boot DefaultErrorViewResolver, um Fehlerbildschirme dynamisch anzupassen

Was du machen willst

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

Passen Sie den Fehlerbildschirm dynamisch an

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

Erweitern Sie Spring Boot DefaultErrorViewResolver, um Fehlerbildschirme dynamisch anzupassen
Passen Sie die Antwort auf REST-API-Fehler mit Spring Boot an (Teil 2).
Passen Sie die Antwort auf REST-API-Fehler mit Spring Boot an (Teil 1).
Einführung in Spring Boot ② ~ AOP ~
Einführung in Spring Boot Teil 1
Spring Boot + PostgreSQL-Fehlerbehebungsmethode
So erstellen Sie mit Spring Boot einen eigenen Controller, der / error entspricht
Verwendung von ModelMapper (Spring Boot)
Rüsten Sie den Federstiefel von der 1.5-Serie auf die 2.0-Serie auf
Ich möchte die Standardfehlermeldung von Spring Boot steuern
[Einführung in Spring Boot] Überprüfung der Formularvalidierung
Änderungen bei der Migration von Spring Boot 1.5 auf Spring Boot 2.0
Änderungen bei der Migration von Spring Boot 2.0 zu Spring Boot 2.2
Javaw.exe Fehler beim Starten von Spring Boot (STS)
So teilen Sie eine Spring Boot-Nachrichtendatei
Fügen Sie Frühlingsstiefel und Gradle zur Sonnenfinsternis hinzu
[Spring Boot] So rufen Sie Eigenschaften dynamisch aus einer in einer URL enthaltenen Zeichenfolge ab
Wenn Sie irgendwo einen Fehler melden möchten, wenn Sie graphql-spring-boot mit Spring Boot verwenden
Spring Boot Whitelabel-Fehlerseite und JSON-Antwort
Verwendung von MyBatis2 (iBatis) mit Spring Boot 1.4 (Spring 4)
Verwendung des eingebauten h2db mit Federstiefel
So verkleinern Sie das Spring Boot Docker-Image
Die Geschichte der Erhöhung der Spring Boot 1.5-Serie auf die 2.1-Serie
Versuchen Sie, die Anmeldefunktion mit Spring Boot zu implementieren
So fügen Sie in Spring Boot einen Klassenpfad hinzu
Einführung in Spring Boot + In-Memory Data Grid
So binden Sie mit einer Eigenschaftendatei in Spring Boot
Versuchen Sie, die Migration mit Spring Boot Flyway zu automatisieren
[Java] Artikel zum Hinzufügen einer Validierung mit Spring Boot 2.3.1.
Ich wollte Spring Boot in einem Multiprojekt gradle
Wenden Sie Twitter Bootstrap 4 mithilfe von Webjars auf Spring Boot 2 an
[Spring Boot] So verweisen Sie auf die Eigenschaftendatei
[Einführung in Spring Boot] Authentifizierungsfunktion mit Spring Security
Spring Boot - So stellen Sie das Sitzungszeitlimit ein
Passen Sie die Anzeige an, wenn im Spring Boot ein Fehler wie 404 Not Found auftritt