我已經是Spring Framework框架的忠實粉絲。對於企業軟件開發者來說它提供了對常見問題的通用解決方案,包括那些你在未來開發中沒有意識到的問題。但是,它構建的J2EE項目變得比較臃腫,需要被一種新的解決方案替代。
我最大的抱怨就是最開始使用spring Framework構建項目十分緩慢和復雜,比如構建一個包含JPA的MVC應用。為改變這種情況,Spring Boot應運而生了。
Spring Boot以一種新的微服務的方式來替代以Spring Framework構建項目的傳統方式,我已經計划在后續的項目開發中使用它。它已經幫我們做了90%的工作,剩下10%的工作需要我們自己去完成。對於我來說,自定義錯誤頁面就是其中之一。比如404錯誤,如果不處理的話,會出現“This application has no explicit mapping for /error, so you are seeing this as a fallback.”的錯誤信息,如圖所示:
Spring Boot默認使用嵌入式Tomcat,默認沒有頁面來處理404等常見錯誤。因此,為了給用戶最佳的使用體驗,404等常見錯誤需要我們自定義頁面來處理。
我們需要用org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer類來實現該功能,在Spring Boot的啟動類(main方法所在類)當中,添加如下代碼:
@Bean public EmbeddedServletContainerCustomizer containerCustomizer() { return (container -> { ErrorPage error401Page = new ErrorPage(HttpStatus.UNAUTHORIZED, "/401.html"); ErrorPage error404Page = new ErrorPage(HttpStatus.NOT_FOUND, "/404.html"); ErrorPage error500Page = new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/500.html"); container.addErrorPages(error401Page, error404Page, error500Page); }); }
這是使用Java 8的lambda表達式來簡化實現的方式,在代碼中創建了三個ErrorPage實例來處理三個通用的HTTP錯誤狀態碼,並將他們添加到Container當中。ErrorPage類是一個封裝了錯誤信息的類,它可以在Jetty和Tomcat環境下使用。
這是使用Java 7內部類的一個等價實現方式:
@Bean public EmbeddedServletContainerCustomizer containerCustomizer() { return new EmbeddedServletContainerCustomizer() { @Override public void customize(ConfigurableEmbeddedServletContainer container) { ErrorPage error401Page = new ErrorPage(HttpStatus.UNAUTHORIZED, "/401.html"); ErrorPage error404Page = new ErrorPage(HttpStatus.NOT_FOUND, "/404.html"); ErrorPage error500Page = new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/500.html"); container.addErrorPages(error401Page, error404Page, error500Page); } }; }
錯誤頁面需要放在Spring Boot web應用的static內容目錄下,它的默認位置是:src/main/resources/static,如下圖所示:
點擊鏈接下載圖中的三個文件的壓縮文件,這些文件使用 HTML5 Boilerplate制作。
現在,就可以看到一個簡易版本的錯誤頁面,可以根據自己的需要對它進行一些美化。
編譯自:http://www.sporcic.org/2014/05/custom-error-pages-with-spring-boot/。
http://blog.csdn.net/github_32521685/article/details/50198467