SpringBoot小技巧:統一異常處理
情景描述
對於接口的定義,我們通常會有一個固定的格式,比如:
但是調用方在請求我們的API時把接口地址寫錯了,就會得到一個404錯誤,且不同於我們定義的數據格式。
我們需要在發生這種系統錯誤時也能返回我們自定義的那種格式,就需要定義一個異常處理類,這個類既可以返回統一的格式,也可以統一記錄異常日誌。
方法
我們在@ExceptionHandler(value = Exception.class)中指明瞭異常器處理Exception及其子類。JsonResponse是我們返回格式的實體類,當發生異常時,會被封裝好並返回給調用方。
@ControllerAdvice public class GlobalExceptionHandler { private Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class); @ExceptionHandler(value = Exception.class) @ResponseBody public JsonResponse defaultErrorHandler(HttpServletRequest request, HttpServletResponse response,Exception e){ logger.error("",e); JsonResponse jsonResponse = new JsonResponse(); jsonResponse.setMsg(e.getMessage()); //[!] 單獨處理運行時異常 if(e instanceof RuntimeException) jsonResponse.setStatus(500); else jsonResponse.setStatus(502); jsonResponse.setData(null); return jsonResponse; } }
資料
@ControllerAdvice
ControllerAdvice拆分開來就是Controller Advice,關於Advice,前面我們講解Spring Aop時講到,其是用於封裝一個切面所有屬性的,包括切入點和需要織入的切面邏輯。這裏ContrllerAdvice也可以這麼理解,其抽象級別應該是用於對Controller進行“切面”環繞的,而具體的業務織入方式則是通過結合其他的註解來實現的。@ControllerAdvice是在類上聲明的註解,其用法主要有三點:
- 結合方法型註解@ExceptionHandler,用於捕獲Controller中拋出的指定類型的異常,從而達到不同類型的異常區別處理的目的;
- 結合方法型註解@InitBinder,用於request中自定義參數解析方式進行註冊,從而達到自定義指定格式參數的目的;
- 結合方法型註解@ModelAttribute,表示其標註的方法將會在目標Controller方法執行之前執行。
參考鏈接
- https://blog.csdn.net/zxfryp909012366/article/details/82955259
- https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/annotation/ExceptionHandler.html
- https://blog.csdn.net/kinginblue/article/details/70186586