背景
web開發過程中,我們的Controller無法預測內部是否會發生異常,當然我們可以通過對每個Controller的方法通過try-catch進行包一層,然後對Exception進行處理,但這樣帶來的就是重複的代碼的編寫,每個方法都要有這個處理邏輯。
解決辦法
Spring提供了兩個註解ControllerAdvice,還有RestControllerAdvice,默認對RestController註解進行處理,具體內容可以到spring官網進行了解,
https://docs.spring.io/spring/docs/4.3.9.BUILD-SNAPSHOT/spring-framework-reference/htmlsingle/#aop-ataspectj-around-advice
本文重點
ControllerAdvice註解,屬於類註解,用這個註解標識的類可以對Controller進行統一攔截,我們主要用它來解決Controller層的異常問題
代碼舉例
如上一篇我們自定義了StatusException,我們就寫一個攔截,對StatusException進行統一處理,其餘異常統一用Exception進行處理,因為Exception是超類,所有他的子類都會被處理
Controller如
exception1方法,拋出StatusException
exception2方法,會拋出類型轉換異常
我們寫一個Controller攔截的類如下分別對StatusException和其他異常進行處理如下
處理結果:
針對StatusException處理,返回map的json如下,因為有@ResponseBody註解,所以這個異常發生時被statusException方法處理,並把異常的code和msg存儲到map中,然後返回給調用方一個json如下
針對Exception異常處理,通過創建ModelAndView,進行頁面的跳轉。就不做演示,大家可以自己嘗試
知識點:
1、類需要加上ControllerAdvice註解,該註解還支持包目錄,可以對不同目錄寫不同的攔截處理
2、異常處理要有順序,一定要將子類異常放在第一個方法,父類異常向後排序,本文距離如果將處理Exception異常的方法放在第一個方法,則永遠不會執行StatusException的異常攔截處理。
通過上述方法能夠完成Controller異常的統一處理,可以將跳轉頁面的Controller和返回json的Controller分開,然後分別用不同的攔截進行統一處理,感謝大家,有問題多交流
閱讀更多 BeginCode 的文章