SpringBoot自定義錯誤頁面
- 2019 年 12 月 7 日
- 筆記
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,如下圖所示:
