2016-05-23 97 views
14

在我的春節,啓動應用程序,我想配置自定義錯誤頁,例如用於404,我加了以下豆到我的應用程序配置:春天引導和自定義404錯誤頁面

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

而且,我創建了一個下面的簡單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> 

,並添加入/resources/templates/文件夾中。現在在404錯誤,我只能看到白色的屏幕。

我在做什麼錯誤,以及如何正確設置我的404頁面?另外,是否可以使用模板,而不僅僅是用於自定義錯誤頁面的靜態頁面?

回答

35

在春季啓動的1.4.x可以添加custom error page

如果你想爲一個給定的狀態代碼顯示自定義HTML錯誤頁面,將文件添加到文件夾/error。錯誤頁面可以是靜態HTML(即添加到任何靜態資源文件夾下)或使用模板構建。文件的名稱應該是確切的狀態碼或系列掩碼。

例如,映射404靜態HTML文件,文件夾結構是這樣的:

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

我試過把資源/ public/error下的我的404.html放在/ resources/error下面,仍然沒有被SB 1.4拾取。我得到了通用的404消息。任何想法如何排除故障? –

+0

thxü使我的一天 –

4

新的errorPage(HttpStatus.NOT_FOUND, 「找到/404.html」)

/404.html代表URL路徑重定向,而不是模板名稱。因爲,你堅持使用模板,你應該創建一個控制器處理/404.html和呈現您404.html位於src/main/resources/templates

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

你也可以更換這些只是查看渲染-ER與視圖控制器控制器:

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

此外,是否有可能使用模板和 自定義錯誤頁,不僅靜態網頁?

是的,這是可能的。但未找到頁面通常是靜態的,並使用模板而不是Plain Old HTML不會產生太大的意義。

+1

如果我想將頁眉/頁腳代碼包含到我的404頁面中,該怎麼辦? –

3

沒有必要爲EmbeddedServletContainerCustomizer豆。簡單地將相應的錯誤頁面(例如404中的404.html)放在公共目錄中應該足夠了(如@brunoid指出的那樣)。

另請注意,您也可以放置一個通用的error.html頁面,每當您的應用程序遇到錯誤或異常時都會顯示該頁面。

一個簡單的例子(在的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> 

這會顯示適當的錯誤狀態和對應的錯誤消息。而且,由於您使用的是Spring Boot,因此您始終可以覆蓋顯示在錯誤頁面上的狀態和錯誤消息。

+0

你可以擴大「Freemarker」? –

+0

Freemarker(http://freemarker.org)是一種視圖技術(如JSP或Thymeleaf)。你不需要使用Freemarker來實現這個功能。你可以使用JSP。 – Naiyer

+1

將您的模板放入/ templates/error /文件夾 – user482745

12

您正在使用Thymeleaf,而Thymeleaf可以在沒有控制器的情況下處理錯誤。
對於這個thymeleaf頁面需要被命名爲error.html
並應在src/main/resources > templates > error.html

Thymleaf error.html

+0

您在error.html上編寫的AnyCode將顯示在瀏覽器中。 所有類型的錯誤將由error.html – GoutamS

+1

處理另外,確保Thymeleaf在類路徑上。 –

1

放置如果你使用Thymeleaf象建議的問題,你可以使用類似於從一個模板以前的答覆,但適合Thymeleaf而不是Freemarker。我還增加了引導的造型:

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

您應該將此代碼放在一個名爲error.html文件並把它放在你的thymeleaf模板目錄。無需添加額外的控制器即可工作。

0

Thymeleaf可以在沒有控制器的情況下處理錯誤。 創建error.html資源文件夾。