1. 程式人生 > >Spring Boot自定義錯誤頁面,Whitelabel Error Page處理方式

Spring Boot自定義錯誤頁面,Whitelabel Error Page處理方式

Spring Boot以一種新的微服務的方式來替代以Spring Framework構建專案的傳統方式,我已經計劃在後續的專案開發中使用它。它已經幫我們做了90%的工作,剩下10%的工作需要我們自己去完成。對於我來說,自定義錯誤頁面就是其中之一。比如404錯誤,如果不處理的話,會出現“This application has no explicit mapping for /error, so you are seeing this as a fallback.”的錯誤資訊,如圖所示:

Whitelabel Error Page

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製作。

現在,就可以看到一個簡易版本的錯誤頁面,可以根據自己的需要對它進行一些美化。