2016-05-23 33 views
14

Nella mia applicazione Stivale Primavera, sto cercando di configurare pagine di errore personalizzate, ad esempio per 404, ho aggiunto una Bean seguito alla mia configurazione dell'applicazione:primavera Boot e personalizzato pagina di errore 404

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

anche , ho creato un semplice modello seguente Thymeleaf:

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

e aggiunto nella cartella /resources/templates/. In questo momento sull'errore 404 posso vedere solo lo schermo bianco.

Cosa sto facendo male e come configurare correttamente la mia pagina 404? Inoltre, è possibile utilizzare modelli e non solo pagine statiche per pagine di errore personalizzate?

risposta

35

In primavera Boot 1.4.x è possibile aggiungere un custom error page:

Se si desidera visualizzare una pagina di errore HTML personalizzato per un determinato codice di stato, si aggiunge un file in una cartella /error. Le pagine di errore possono essere HTML statico (ad esempio aggiunto in una delle cartelle di risorse statiche) o costruito utilizzando i modelli. Il nome del file deve essere il codice di stato esatto o una maschera di serie.

Ad esempio, per mappare 404 in un file HTML statico, la struttura delle cartelle sarebbe simile a questa:

src/ 
+- main/ 
    +- java/ 
    | + <source code> 
    +- resources/ 
     +- public/ 
      +- error/ 
      | +- 404.html 
      +- <other public assets> 
+2

Ho provato a mettere il mio 404.html sotto risorse/pubblico/errore, sotto/risorse/errore e ancora non viene prelevato con SB 1.4. Sto ricevendo il messaggio generico 404. Qualche idea su come risolvere? –

+0

thx u made my day –

4

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

Che /404.html rappresenta il percorso URL Redirect, non il nome del modello. Dal momento che, si insiste ad utilizzare un modello, è necessario creare un controller che gestisce il /404.html e rende la vostra 404.html risiede in src/main/resources/templates:

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

Si può anche sostituire questi solo visualizzare il rendering-er controller con un View Controller :

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

Inoltre, è possibile utilizzare i modelli e non solo pagine statiche per le pagine di errore personalizzate ?

Sì, è possibile. Ma le pagine non trovate sono in genere statiche e l'utilizzo di un modello anziché Plain Old HTMLs non ha molto senso.

+1

E se volessi includere il codice dell'intestazione/piè di pagina nella mia pagina 404? –

3

v'è alcuna necessità per il bean EmbeddedServletContainerCustomizer. Inserire semplicemente la pagina di errore corrispondente (come 404.html in caso di 404) nella directory pubblica dovrebbe essere sufficiente (come indicato da @brunoid).

Si noti inoltre che è possibile anche inserire una pagina generica error.html che verrà visualizzata ogni volta che l'applicazione riscontra un errore o un'eccezione.

Un semplice esempio (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> 

Questo sarà corretta visualizzazione stato di errore e il corrispondente messaggio di errore. E poiché stai usando Spring Boot, puoi sempre sovrascrivere lo stato e i messaggi di errore che vengono visualizzati nella tua pagina di errore.

+0

Puoi espandere su "Freemarker"? –

+0

Freemarker (http://freemarker.org) è una tecnologia di visualizzazione (come JSP o Thymeleaf). Non è necessario utilizzare Freemarker perché funzioni. Puoi usare JSP. – Naiyer

+1

Inserisci il tuo modello in/templates/error/folder – user482745

12

Si sta utilizzando Thymeleaf e Thymeleaf è in grado di gestire l'errore senza un controller.
Per questa pagina thymeleaf necessità di essere nominato come error.html
e deve essere posto sotto src/main/resources > templates > error.html

Thymleaf error.html

+0

AnyCode che scrivi su error.html verrà visualizzato sul browser. Tutti i tipi di errore saranno gestiti da error.html – GoutamS

+1

Inoltre, assicurarsi che Thymeleaf sia sul classpath. –

1

Se si utilizza Thymeleaf come suggerito nella domanda, è possibile utilizzare un modello simile a quello da la risposta precedente, ma appropriata per Thymeleaf anziché Freemarker. Ho anche aggiunto bootstrap per lo styling:

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

Si dovrebbe inserire questo codice in un file chiamato error.html e posizionarlo nella directory dei modelli thymeleaf. Non è necessario aggiungere un controller aggiuntivo perché funzioni.

0

Thymeleaf può gestire l'errore senza un controller. crea error.html nella cartella delle risorse.