SpringMVC-Controller層異常統一處理

背景

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方法,會拋出類型轉換異常

SpringMVC-Controller層異常統一處理

兩個拋出不同異常的Controller

我們寫一個Controller攔截的類如下分別對StatusException和其他異常進行處理如下

SpringMVC-Controller層異常統一處理

針對不同異常的不同處理

處理結果:

針對StatusException處理,返回map的json如下,因為有@ResponseBody註解,所以這個異常發生時被statusException方法處理,並把異常的code和msg存儲到map中,然後返回給調用方一個json如下

SpringMVC-Controller層異常統一處理

StatusException異常處理返回json樣式

針對Exception異常處理,通過創建ModelAndView,進行頁面的跳轉。就不做演示,大家可以自己嘗試

知識點:

1、類需要加上ControllerAdvice註解,該註解還支持包目錄,可以對不同目錄寫不同的攔截處理

2、異常處理要有順序,一定要將子類異常放在第一個方法,父類異常向後排序,本文距離如果將處理Exception異常的方法放在第一個方法,則永遠不會執行StatusException的異常攔截處理。

通過上述方法能夠完成Controller異常的統一處理,可以將跳轉頁面的Controller和返回json的Controller分開,然後分別用不同的攔截進行統一處理,感謝大家,有問題多交流


分享到:


相關文章: