Page d'erreur Spring Boot et custom 404

Dans mon Printemps de Démarrage de l'application, je suis en train de configurer les pages d'erreur personnalisées, par exemple pour les 404, j'ai ajouté un Haricot à ma configuration de l'application:

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

en outre, j'ai créé un Thymeleaf template simple suivant:

<!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>

et ajouté dans /resources/templates/ dossier. Pour l'instant, sur l'erreur 404, Je ne vois que l'écran blanc.

Qu'est-ce que je fais de mal et comment configurer correctement ma page 404? Aussi, est-il possible d'utiliser des modèles et pas seulement des pages statiques pour des pages d'erreur personnalisées?

21
demandé sur Mahozad 2016-05-23 21:49:24

6 réponses

Dans La Botte De Printemps 1.4.x vous pouvez ajouter un page d'erreur personnalisée:

si vous voulez afficher une page D'erreur HTML personnalisée pour un code d'état donné, vous ajoutez un fichier à un /error dossier. Les pages d'erreur peuvent être soit du HTML statique (i.e. ajouté sous n'importe lequel des dossiers de ressources statiques) ou construit en utilisant des gabarits. Le nom du fichier doit être le code d'état exact ou un masque de série.

par exemple, pour map 404 vers un fichier HTML statique, la structure de votre dossier devrait ressembler à ceci:

src/
 +- main/
     +- java/
     |   + <source code>
     +- resources/
         +- public/
             +- error/
             |   +- 404.html
             +- <other public assets>
42
répondu brunoid 2017-01-23 19:10:09

vous utilisez Thymeleaf, et Thymeleaf peut gérer les erreurs sans contrôleur.

pour une page d'erreur générique cette page Thymeleaf doit être nommée comme error.html

et devrait être placé sous src/main/resources > templates > error.html

Thymleaf error.html

pour les pages d'erreur spécifiques, vous devez créer des fichiers nommés comme le code d'erreur http dans un dossier nommé error, comme:src/main/resources/templates/error/404.html.

17
répondu GoutamS 2018-05-02 17:01:56

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

/404.html représente Chemin URL de Redirection, pas le nom du modèle. Depuis, vous insistez pour utiliser un modèle, vous devez créer un contrôleur qui gère l' /404.html et rend votre 404.html réside dans src/main/resources/templates:

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

vous pouvez aussi remplacer ces contrôleurs de rendu-er just view par un vue Contrôleur:

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

aussi, est - il possible d'utiliser des gabarits et non seulement des pages statiques pour des pages d'erreur personnalisées ?

Oui, c'est possible. Mais les pages non trouvées sont généralement statiques et utilisent un modèle au lieu de Un Bon Vieux Format Html ne pas faire beaucoup de sens.

4
répondu Ali Dehghani 2016-05-23 19:25:31

il n'y a pas besoin de EmbeddedServletContainerCustomizer bean. Il suffit de mettre la page d'erreur correspondante (telle que 404.html dans le cas de 404) dans le répertoire public devrait suffire (comme indiqué par @brunoid).

notez Également que vous pouvez aussi mettre un générique error.html page qui s'affichera chaque fois que votre application rencontre une erreur ou une exception.

un exemple simple (en 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>

ceci affichera l'état d'erreur approprié et le message d'erreur correspondant. Et puisque vous utilisez Spring Boot, vous pouvez toujours outrepasser les messages d'état et d'erreur qui s'affichent sur votre page d'erreur.

3
répondu Naiyer 2017-02-02 18:02:26

si vous utilisez Thymeleaf comme suggéré dans la question, vous pouvez utiliser un modèle similaire à celui de la réponse précédente, mais approprié pour Thymeleaf plutôt que Freemarker. J'ai aussi ajouté bootstrap pour le style:

<!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>

Vous devez placer ce code dans un fichier appelé error.html et placez-le dans votre répertoire Thymeleaf templates. Il n'est pas nécessaire d'ajouter un contrôleur supplémentaire pour que cela fonctionne.

3
répondu OlgaMaciaszek 2017-09-02 09:26:00

Thymeleaf peut gérer les erreurs sans contrôleur. créer erreur.code html pour dossier de ressources.

0
répondu sujoydutta 2017-11-30 09:12:11