SpringBoot2.x系列:整合SpringMVC之錯誤處理深度定製實現

一. 自定義錯誤處理
經過上一章節的學習,我們瞭解了Spring Boot底層是怎麼處理error的。那麼看了上面的源碼後,我們是否可以自己定義404或者500的錯誤頁面返回給客戶端呢?
自定義錯處處理方式
Spring Boot開發指南上提供了以下四種方式:
1️⃣. 自定義一個bean,實現ErrorController接口,那麼默認的錯誤處理機制將不再生效;
2️⃣. 自定義一個bean,繼承BasicErrorController類,使用一部分現成的功能,自己也可以添加新的public方法,使用@RequestMapping及其produces屬性指定新的地址映射;
3️⃣. 自定義一個ErrorAttribute類型的bean,那麼還是默認的兩種響應方式,只不過改變了內容項而已;
4️⃣. 繼承AbstractErrorController.
接下來我給大家簡單講解幾種實現自定義錯誤的處理實現方式。
二. 自定義錯誤處理頁面
首先我們講解一個簡單的實現錯誤處理的方式,就是用我們自定義的html頁面來替換默認的”whitelabel“頁面。
1. 創建一個web項目(略)
目錄結構如下,創建過程略。

2. 創建自定義的錯誤頁面
我們在src/main/resources路徑下,新建文件夾reources/static/error文件夾,然後新建404.html和500.html,然後編寫自己想要的錯誤內容即可:
2.1 404.html頁面:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>404</title> </head> <body> <h1>親,你要找的頁面跑到火星去了哦...</h1> </body> </html>
2.2 500.html頁面:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>500</title> </head> <body> <h1>服務器有點累了...</h1> </body> </html>
3. 創建Controller測試接口方法
我們創建一個Controller類,裏面創建兩個測試接口方法。
package com.yyg.boot.web; import org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ResponseBody; /** * @Description Description * @Author 一一哥Sun * @Date Created in 2020/3/27 */ @Controller public class HelloController { @ResponseBody @GetMapping("/show") public String showMsg() { return "success"; } @GetMapping("/showError") public void showError() { throw new RuntimeException("自定義異常..."); } }
4. 重啓程序,進行測試
正常訪問時的效果:

產生404異常時跳轉到的頁面:

產生500錯誤時跳轉到的頁面:

上面的實現方式雖然簡單,但是這種自定義錯誤頁面的方式只對瀏覽器有效,對非瀏覽器發送來的請求則不會生效,效果如下:

因此下面我們講一下如何通過自定義異常處理來解決這個問題。
三. Spring Boot中返回JSON格式來處理異常
接下來我們通過@ControllerAdvice@ExceptionHandler註解,來統一定義處理不同的Exception,從而映射到不同的錯誤處理頁面.
而當我們要實現RESTful API時,返回的錯誤是JSON格式的數據,而不是HTML頁面,這時我們只需在@ExceptionHandler之後加入@ResponseBody,就能將處理函數return的內容轉換爲JSON格式.
下面具體講述如何實現返回JSON格式的異常處理方案.
我們繼續在上一個案例的項目中完成下面的內容。
1. 創建統一的JSON返回對象
創建統一的JSON返回對象,code:消息類型;message:消息內容;url:請求的url;data:請求返回的數據.
package com.yyg.boot.domain; import lombok.Data; /** * @Description Description * @Author 一一哥Sun * @Date Created in 2020/3/27 */ @Data public class ErrorInfo<T> { public static final Integer OK = 0; public static final Integer ERROR = 100; private Integer code; private String message; private String url; private T data; }
2. 創建一個自定義異常類CustomException
該類用來實驗捕獲該異常,並返回json.
package com.yyg.boot.exception; /** * @Description 自定義異常類 * @Author 一一哥Sun * @Date Created in 2020/3/27 */ public class CustomException extends Exception{ public CustomException(String message) { super(message); } }
3. 在controller中創建一個接口方法
@RequestMapping("/json") public String handleJsonException() throws CustomException { throw new CustomException("json格式的異常處理方案..."); }
4. 在GlobalExceptionHandler類中創建一個異常處理方法
在com.yyg.boot.exception中創建一個全局的GlobalExceptionHandler異常處理類,在該類上添加@ControllerAdvice註解。
package com.yyg.boot.exception; import com.yyg.boot.domain.ErrorInfo; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpServletRequest; /** * @Description Description * @Author 一一哥Sun * @Date Created in 2020/3/27 */ @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(value = CustomException.class) @ResponseBody public ErrorInfo<String> jsonErrorHandler(HttpServletRequest req, CustomException e) throws Exception { ErrorInfo<String> info = new ErrorInfo<>(); info.setMessage(e.getMessage()); info.setCode(ErrorInfo.ERROR); info.setData("JSON格式異常處理信息"); info.setUrl(req.getRequestURL().toString()); return info; } }
5. 項目結構

6. 驗證結果
啓動應用,訪問:http://localhost:8080/json,得到如下響應內容:

此時會發現無論是用瀏覽器,還是postman,測試得到的結果都是jsno格式的數據。
至此,已完成在Spring Boot中創建統一的異常處理,實際實現還是依靠Spring MVC的註解,更多更深入的使用可參考Spring MVC的文檔.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章