Spring MVC異常統一處理的三種方式
阿新 • • 發佈:2018-11-10
Spring 統一異常處理有 3 種方式,分別為:
- 使用 @ ExceptionHandler 註解
- 實現 HandlerExceptionResolver 介面
- 使用 @controlleradvice 註解
HandlerExceptionResolver,返回的是modelAndView。
@ControllerAdvice只是標註當前bean是對Controller增強,具體是增強什麼,則是配合@ExceptionHandler對異常進行精確處理。
HandlerExceptionResolver則可以進行全域性的異常控制,因此,所有的controller發生的異常都會進入其實現類,我們需要做通用處理。
檢視原始碼,可以發現HandlerExceptionResolver介面的抽象類AbstractHandlerMethodExceptionResolver和其子類ExceptionHandlerExceptionResolver一起組成使用@ExceptionHandler註釋的方法進行異常解析的功能。
現在基本都使用@ [email protected]註解來實現全域性的異常捕獲。
在執行@RequestMapping方法時發生的異常
這也是最常見的異常了,處理業務邏輯時可能會發生各種問題,如資料庫報錯、請求引數格式錯誤/缺失/值非法等。此類異常的捕獲方法有兩種,對於提供RESTful
服務的應用,使用@ControllerAdvice
和@ExceptionHandler
註解; 對於使用模板渲染HTML的應用,實現HandlerExceptionResolver
介面。
在執行@RequestMapping之前遇到的異常
該類異常通常是因為SpringMVC沒有找到能處理當前請求的控制器造成的,比如最常見的404。此時@ControllerAdvice
@RequestMapping
方法根本沒找到,更不可能執行
此時我們要寫一個@RestController
,並實現ErrorController
介面:
@RestController public class FinalExceptionHandler implements ErrorController { @RequestMapping(value = "/error", produces = Const.MIME.JSON) public MatrixResponse error(HttpServletResponse resp, HttpServletRequest req) { // 錯誤處理邏輯 return new MatrixResponse(ErrorCode.INTERNAL_ERROR); } @Override public String getErrorPath() { return "/error"; } }