讀古今文學網 > Spring Boot實戰 > 3.3 定制應用程序錯誤頁面 >

3.3 定制應用程序錯誤頁面

錯誤總是會發生的,那些在生產環境裡最健壯的應用程序偶爾也會遇到麻煩。雖然減小用戶遇到錯誤的概率很重要,但讓應用程序展現一個好的錯誤頁面也同樣重要。

近年來,富有創意的錯誤頁已經成為了一種藝術。如果你曾見到過GitHub.com的星球大戰錯誤頁,或者是DropBox.com的Escher立方體錯誤頁的話,你就能明白我在說什麼了。

我不知道你在使用閱讀列表應用程序時有沒有碰到錯誤,如果有的話,你看到的頁面應該和圖3-1里的很像。

Spring Boot默認提供這個「白標」(whitelabel)錯誤頁,這是自動配置的一部分。雖然這比Stacktrace頁面要好一點,但和網上那些偉大的錯誤頁藝術品卻不可同日而語。為了讓你的應用程序故障頁變成大師級作品,你需要為應用程序創建一個自定義的錯誤頁。

Spring Boot自動配置的默認錯誤處理器會查找名為error的視圖,如果找不到就用默認的白標錯誤視圖,如圖3-1所示。因此,最簡單的方法就是創建一個自定義視圖,讓解析出的視圖名為error。

圖 3-1 Spring Boot的默認白標錯誤頁面

這一點歸根到底取決於錯誤視圖解析時的視圖解析器。

  • 實現了Spring的View接口的Bean,其 ID為error(由Spring的BeanNameViewResolver所解析)。

  • 如果配置了Thymeleaf,則有名為error.html的Thymeleaf模板。

  • 如果配置了FreeMarker,則有名為error.ftl的FreeMarker模板。

  • 如果配置了Velocity,則有名為error.vm的Velocity模板。

  • 如果是用JSP視圖,則有名為error.jsp的JSP模板。

因為我們的閱讀列表應用程序使用了Thymeleaf,所以我們要做的就是創建一個名為error.html的文件,把它和其他的應用程序模板一起放在模板文件夾裡。代碼清單3-7是一個簡單有效的錯誤頁,可以用來代替默認的白標錯誤頁。

代碼清單3-7 閱讀列表應用程序的自定義錯誤頁

<html>
  <head>
    <title>Oops!</title>
    <link rel="stylesheet" th:href="@{/style.css}"></link>
  </head>

  <html>
    <p>
      <span>Oops!</span><br/>
      <img th:src="@{/MissingPage.png}"></img>
      <p>There seems to be a problem with the page you requested
         (<span th:text="${path}"></span>).</p>     ←---顯示請求路徑

      <p th:text="${'Details: ' + message}"></p>    ←---顯示錯誤明細
    </p>
  </html>

</html>

  

這個自定義的錯誤模板應該命名為error.html,放在模板目錄裡,這樣Thymeleaf模板解析器才能找到它。在典型的Maven或Gradle項目裡,這就意味著要把該文件放在src/main/resources/ templates中,運行時它就在Classpath的根目錄裡。

基本上,這個簡單的Thymeleaf模板就是顯示一張圖片和一些提示錯誤的文字。其中有兩處特別的信息需要呈現:錯誤的請求路徑和異常消息。但這還不是錯誤頁上的全部細節。默認情況下,Spring Boot會為錯誤視圖提供如下錯誤屬性。

  • timestamp:錯誤發生的時間。

  • status:HTTP狀態碼。

  • error:錯誤原因。

  • exception:異常的類名。

  • message:異常消息(如果這個錯誤是由異常引起的)。

  • errorsBindingResult異常裡的各種錯誤(如果這個錯誤是由異常引起的)。

  • trace:異常跟蹤信息(如果這個錯誤是由異常引起的)。

  • path:錯誤發生時請求的URL路徑。

其中某些屬性,比如path,在向用戶交待問題時還是很有用的。其他的,比如trace,用起來要保守一點,將其隱藏,或者用得聰明點,讓錯誤頁盡可能對用戶友好。

請注意,模板裡還引用了一張名為MissingPage.png的圖片。圖片的實際內容並不重要,所以盡情挑選適合你的圖片就好了,但請一定將它放在src/main/resources/static或src/main/resources/public裡,這樣應用程序運行時才能找到它。

圖3-2是發生錯誤時用戶會看到的頁面。雖然它算不上一件藝術品,但還是把應用程序錯誤頁的藝術水準稍微提高了那麼一點。

圖 3-2 遇到錯誤時展現的自定義錯誤頁