在之前的文章中我介紹了如何使用 @ControllerAdvice 來進行全局異常處理,但是這種異常處理方式一般用來處理應用級別的異常,一些容器級別的錯誤就處理不了,比如 Filter 中拋出的異常。因此,Spring Boot 中對於異常的處理還有另外的方式。
比如默認情況下,當我們通過 Postman 等工具來請求一個不存在的接口,則會返回如下 json 格式的錯誤數據:

而如果是通過瀏覽器訪問的話,Spring Boot 則會有一個默認的錯誤頁面展示給用戶。
無論是錯誤頁面還是里面的顯示內容都是可以自定義的,下面分別進行介紹。
一、基本配置
1,使用靜態頁面
(1)如果不需要向用戶展示詳細的錯誤信息,可以把錯誤信息定義成靜態頁面。即在 resource/static 目錄下創建 error 目錄,然后在 error 目錄中創建錯誤展示頁面。錯誤展示頁面命名規則有如下兩種:
- 一種是直接使用具體的響應碼命名文件,比如:404.html、405.html、500.html
- 另一種可以使用 4xx.html、5xx.html 這樣的命名
如果用戶定義了多個錯誤頁面,它們優先級如下: 響應碼.html 的優先級高於 4xx.html、5xx.html 頁面的優先級。比如:發生一個 404 錯誤,則優先展示 404.html 而不是 4xx.html 動態頁面的優先級高於靜態頁面。比如:resource/templates 和 resocurce/static 下同時定義了 4xx.html,則優先展示 resources/templates/4xx.html
(2)比如 404.html 里面的內容如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
發生了404錯誤。
</body>
</html>
(3)如果使用瀏覽器訪問一個不存在的接口,顯示的結果如下:
2,使用動態模版
(1)如果需要向用戶展示完整的錯誤信息,就需要采用視圖模版技術。這里以 Thymeleaf 為例,首先引入模版相關的依賴。<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
(2)Thymeleaf 頁面模版默認處於 resource/templates 目錄下,因此在該目錄下創建 error 目錄,在創建錯誤展示頁。

(3)4xx.html 里的內容如下,展示出 Spring Boot 返回的5條錯誤相關信息,分別是:timestamp、status、error、message、path
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <table border="1"> <tr> <td>timestamp</td> <td th:text="${timestamp}"></td> </tr> <tr> <td>status</td> <td th:text="${status}"></td> </tr> <tr> <td>error</td> <td th:text="${error}"></td> </tr> <tr> <td>message</td> <td th:text="${message}"></td> </tr> <tr> <td>path</td> <td th:text="${path}"></td> </tr> </table> </body> </html>
(4)當請求一個不存在的接口時,頁面顯示的結果如下: