筆記之spring全域性異常處理

2021-08-19 15:34:22 字數 3977 閱讀 4654

使用 @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還可以處理某些註解丟擲的異常例如 ...