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,如下圖所示: