wake-up-neo.net

Spring Boot- und benutzerdefinierte 404-Fehlerseite

In meiner Spring Boot-Anwendung versuche ich, benutzerdefinierte Fehlerseiten zu konfigurieren. Beispielsweise für 404 habe ich meiner Anwendungskonfiguration einen folgenden Bean hinzugefügt:

@Bean
public EmbeddedServletContainerCustomizer containerCustomizer() {
    return new EmbeddedServletContainerCustomizer() {
        @Override
        public void customize(ConfigurableEmbeddedServletContainer container) {
            container.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/404.html"));
        }
    };
}

Außerdem habe ich eine einfache Thymeleaf-Vorlage erstellt:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
    <head>
        <title>404 Not Found</title>
        <meta charset="utf-8" />
    </head>
    <body>
        <h3>404 Not Found</h3>
        <h1 th:text="${errorCode}">404</h1>
        <p th:utext="${errorMessage}">Error Java.lang.NullPointerException</p>
        <a href="/" th:href="@{/}">Back to Home Page</a>
    </body>
</html>

und fügte es in den /resources/templates/-Ordner hinzu. Im Moment kann ich auf dem 404-Fehler nur weißen Bildschirm sehen.

Was mache ich falsch und wie kann ich meine 404-Seite richtig einrichten? Kann man für benutzerdefinierte Fehlerseiten auch Vorlagen und nicht nur statische Seiten verwenden?

24
brunoid

In Spring Boot 1.4.x können Sie eine benutzerdefinierte Fehlerseite hinzufügen :

Wenn Sie eine benutzerdefinierte HTML-Fehlerseite für einen bestimmten Statuscode anzeigen möchten, fügen Sie einem /error-Ordner eine Datei hinzu. Fehlerseiten können entweder statisches HTML sein (d. H. Unter einem beliebigen statischen Ressourcenordner hinzugefügt) oder mithilfe von Vorlagen erstellt werden. Der Name der Datei sollte der genaue Statuscode oder eine Serienmaske sein.

Um beispielsweise 404 einer statischen HTML-Datei zuzuordnen, würde Ihre Ordnerstruktur folgendermaßen aussehen:

src/
 +- main/
     +- Java/
     |   + <source code>
     +- resources/
         +- public/
             +- error/
             |   +- 404.html
             +- <other public assets>
46
brunoid

Sie verwenden Thymeleaf, und Thymeleaf kann Fehler ohne Controller behandeln. 

Für eine generische Fehlerseite muss diese Thymeleaf-Seite als error.html bezeichnet werden.
und sollte unter src/main/resources > templates > error.html platziert werden

Thymleaf error.html

Für bestimmte Fehlerseiten müssen Sie Dateien mit dem Namen http-Fehlercode in einem Ordner namens error erstellen, z. B. src/main/resources/templates/error/404.html.

21
GoutamS

Wenn Sie Thymeleaf wie in der Frage vorgeschlagen verwenden, können Sie eine Vorlage verwenden, die der aus der vorherigen Antwort ähnelt, jedoch eher für Thymeleaf als für Freemarker geeignet ist. Ich habe auch Bootstrap für das Styling hinzugefügt:

<!DOCTYPE html>
<html lang="en"
      xmlns:th="http://www.thymeleaf.org">
<head>
<title>Error Page</title>
<link href="/webjars/bootstrap/3.3.7-1/css/bootstrap.min.css" rel="stylesheet" media="screen"/>
<script src="/webjars/jquery/3.2.1/jquery.min.js"></script>
<script src="/webjars/bootstrap/3.3.7-1/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
<div class="jumbotron alert-danger">
    <h1>Oops... something went wrong.</h1>
    <h2 th:text="${status + ' ' + error}"></h2>
</div>
</div>
</body>
</html>

Sie sollten diesen Code in einer Datei mit dem Namen error.html und in Ihrem Thymeleaf-Vorlagenverzeichnis ablegen. Es ist nicht erforderlich, einen zusätzlichen Controller hinzuzufügen, damit er funktioniert.

4
OlgaMaciaszek

neue ErrorPage (HttpStatus.NOT_FOUND, " /404.html ")

Dieser /404.html steht für den URL-Pfad zur Umleitung, nicht für den Vorlagennamen. Da Sie darauf bestehen, eine Vorlage zu verwenden, sollten Sie einen Controller erstellen, der den /404.html verarbeitet und Ihren 404.html in src/main/resources/templates wiedergibt:

@Controller
public class NotFoundController {
    @RequestMapping("/404.html")
    public String render404(Model model) {
        // Add model attributes
        return "404";
    }
}

Sie können diese nur View-Renderer-Controller auch durch einen View-Controller ersetzen:

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/404.html").setViewName("404");
    }
}

Ist es möglich, Vorlagen und nicht nur statische Seiten für .__ zu verwenden. benutzerdefinierte Fehlerseiten?

Ja es ist möglich. Nicht gefundene Seiten sind jedoch in der Regel statisch und die Verwendung einer Vorlage anstelle von Plain Old HTMLs macht keinen Sinn.

4
Ali Dehghani

Die Bean EmbeddedServletContainerCustomizer ist nicht erforderlich. Es reicht aus, die entsprechende Fehlerseite (wie 404.html im Fall von 404) einfach in das öffentliche Verzeichnis zu legen (wie von @brunoid angegeben).

Beachten Sie außerdem, dass Sie auch eine generische error.html-Seite einfügen können, die angezeigt wird, wenn Ihre Anwendung auf einen Fehler oder eine Ausnahme stößt.

Ein einfaches Beispiel (in Freemarker) -

<html lang="en">
<head>
</head>
<body>
    <div class="container">
        <div class="jumbotron alert-danger">
            <h1>Oops. Something went wrong</h1>
            <h2>${status} ${error}</h2>
        </div>
    </div>
</body>

</html>

Dies zeigt den richtigen Fehlerstatus und die entsprechende Fehlermeldung an. Da Sie Spring Boot verwenden, können Sie die Status- und Fehlermeldungen, die auf der Fehlerseite angezeigt werden, jederzeit überschreiben. 

4
Naiyer

Überprüfen Sie, ob Sie Thymeleaf im Klassenpfad haben, oder fügen Sie den folgenden Code hinzu und importieren Sie das Projekt erneut.

<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
1
Himadri Mandal

Wir müssen neu hinzufügen 

 @Controller
public class MyErrorController implements ErrorController  {

    @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 "error404";
        }
        else if(statusCode == HttpStatus.INTERNAL_SERVER_ERROR.value()) {
            return "error500";
        }
    }
    return "error";
}

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

Thymeleaf kann Fehler ohne Controller behandeln . Create error.html im Ressourcenordner.

0
sujoydutta