使用 @controlleradvice + @exceptionhandler 進行全域性的 controller 層異常處理,只要設計得當,就再也不用在 controller 層進行 try-catch 了!而且,@validated 校驗器註解的異常,也可以一起處理,無需手動判斷繫結校驗結果 bindingresult/errors 了
一、優缺點
優點:將 controller 層的異常和資料校驗的異常進行統一處理,減少模板**,減少編碼量,提公升擴充套件性和可維護性。
缺點:只能處理 controller 層未捕獲(往外拋)的異常,對於 interceptor(***)層的異常,spring 框架層的異常,就無能為力了
二、基本使用示例
@controlleradvice 註解定義全域性異常處理類
@controlleradvice
public class globalexceptionhandler
請確保此 globalexceptionhandler 類能被掃瞄到並裝載進 spring 容器中
@exceptionhandler 註解宣告異常處理方法
@controlleradvice
public class globalexceptionhandler
}方法 handleexception() 就會處理所有 controller 層丟擲的 exception 及其子類的異常,這是最基本的用法了。
被 @exceptionhandler 註解的方法的引數列表裡
@target(elementtype.method)
@retention(retentionpolicy.runtime)
@documented
public @inte***ce exceptionhandler ;
}如果 @exceptionhandler 註解中未宣告要處理的異常型別,則預設為引數列表中的異常型別
@controlleradvice
public class globalexceptionhandler
}引數物件就是 controller 層丟擲的異常物件
三、處理 service 層上拋的業務異常
封裝的業務異常類:
public class busines***ception extends runtimeexception
}service 實現類
@service
public class dogservice
}其中輔助工具類bsutil
public static void istrue(boolean expression, string error)
}在 globalexceptionhandler 類中宣告該業務異常類,並進行相應的處理,然後返回給使用者。更貼近真實專案的**
/*** created by kinginblue on 2017/4/10.
* @controlleradvice + @exceptionhandler 實現全域性的 controller 層的異常處理
*/@controlleradvice
public class globalexceptionhandler
/*** 處理所有業務異常
* @param e
* @return
*/@exceptionhandler(busines***ception.class)
@responsebody
logger.error(e.getmessage(), e);
response.setfail(e.getmessage());
return response;}}
四、處理 controller 資料繫結、資料校驗的異常
在 dog 類中的字段上的註解資料校驗規則
@data
public class dog ", groups = )
@min(value = 1, message = "", groups = )
private long id;
@notblank(message = "", groups = )
private string name;
@min(value = 1, message = "", groups = )
private integer age;
}說明:@notnull、@min、@notblank 這些註解的使用方法,不在本文範圍內。如果不熟悉,請查詢資料學習即可。
其他說明:
@data 註解是 **lombok** 專案的註解,可以使我們不用再在**裡手動加 getter & setter。
在 eclipse 和 intellij idea 中使用時,還需要安裝相關外掛程式,這個步驟自行google/baidu 吧!
springmvc 中對於 restful 的 json 介面來說,資料繫結和校驗,是這樣的:
/*** 使用 globalexceptionhandler 全域性處理 controller 層異常的示例
* @param dog
* @return
*/// 執行業務
dog newdog = dogservice.update(dog);
// 返回資料
resp.setdata(newdog);
return resp;
}使用 @validated + @requestbody 註解實現。
當使用了 @validated + @requestbody 註解但是沒有在繫結的資料物件後面跟上 errors 型別的引數宣告的話,spring mvc 框架會丟擲 methodargumentnotvalidexception 異常。
所以,在 globalexceptionhandler 中加上對 methodargumentnotvalidexception 異常的宣告和處理,就可以全域性處理資料校驗的異常了
/*** created by kinginblue on 2017/4/10.
* @controlleradvice + @exceptionhandler 實現全域性的 controller 層的異常處理
*/@controlleradvice
public class globalexceptionhandler
/*** 處理所有業務異常
* @param e
* @return
*/@exceptionhandler(busines***ception.class)
@responsebody
logger.error(e.getmessage(), e);
response.setfail(e.getmessage());
return response;
}/**
* 處理所有介面資料驗證異常
* @param e
* @return
*/@exceptionhandler(methodargumentnotvalidexception.class)
@responsebody
logger.error(e.getmessage(), e);
response.setfail(e.getbindingresult().getallerrors().get(0).getdefaultmessage());
return response;}}
此處理解 :定義全域性異常處理器 通過 controlleradvice 以及exceptionhandler 註解 將攔截所有 controller層的異常 可以對攔截的異常型別進行 區分並 進行相應處理
例如錯誤日誌列印 以及 異常的友好響應 (這裡可以自定義異常類需要繼承runtimeexception 對異常的屬性 進行個性化定製 如 新增 錯誤碼 以及 錯誤資訊字段 還有異常資訊 可以 繼承自runtimeexception)
此處響應 可以 分裝成respose物件 字段分別有(success boolean型別;errorcode 、errormsg、以及資料體 data object型別)
Spring 異常處理之全域性處理
承接上文spring異常處理之本地處理,本文介紹spring異常處理的第三種方式,也就是全域性處理。為什麼將該方式取名為全域性處理,其實很簡單,因為該方式本質上和本地處理是一樣的,無非就是本地處理將異常處理方法或者說異常處理邏輯直接寫在controller中,而全域性處理其實就是把本地處理中的異常處...
Spring 全域性異常處理
1 描述 在j2ee專案的開發中,不管是對底層的資料庫操作過程,還是業務層的處理過程,還是控制層的處理過程,都不可避免會遇到各種可預知的 不可預知的異常需要處理。每個過程都單獨處理異常,系統的 耦合度高,工作量大且不好統一,維護的工作量也很大。那麼,能不能將所有型別的異常處理從各處理過程解耦出來,這...
Spring中全域性異常處理
1 首先我們編寫乙個全域性異常處理的類exceptionhandle,然後再類上加上註解 controlleradvice controlleradvice可以選擇要處理異常的包例如 controlleradvice com.ldd.controlleradvice還可以處理某些註解丟擲的異常例如 ...