SpringBoot全局異常處理方案分享
一 業(yè)務(wù)場景
調(diào)用接口時需要對屬性進行校驗,比如屬性長度,當(dāng)屬性為郵箱時校驗郵箱格式等,這時候要要用到@Validated注解,在使用這個注解后發(fā)現(xiàn)出現(xiàn)了一個問題,調(diào)用接口后并沒有返回我們想要的報錯結(jié)果,而是返回了 "message": "Validation failed for object='IMMessageSend'. Error count: 1",顯然這不是我們想要的結(jié)果,查看控制臺打印,發(fā)現(xiàn)如下輸出:
org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver Line:199 - Resolved [org.springframework.web.bind.MethodArgumentNotValidException: Validation failed for argument [0] in public com.dst.mid.common.entities.result.Results<com.dst.message.core.common.model.IMMessageResponse> com.dst.message.core.modules.business.open.sendmessage.controller.IMMessageController.sendMessage(com.dst.message.core.common.model.IMMessageSend): [Field error in object 'IMMessageSend' on field 'msg': rejected value [901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789]; codes [Length.IMMessageSend.msg,Length.msg,Length.java.lang.String,Length]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [IMMessageSend.msg,msg]; arguments []; default message [msg],5,0]; default message [消息長度不能大于500個字符]] ]
原因是異常攔截字符串太長,這時候我們需要定義全局異常處理,來多系統(tǒng)拋出的異常進行攔截處理
二 全局系統(tǒng)異常類
一)全局系統(tǒng)異常類
@Data
public class IMMessageSend {
/**
* 發(fā)送消息信息
*/
@Length(max = 500,message = "消息長度不能大于500個字符")
private String msg;
/**
* 接收用戶id集合
*/
private List<String> receiveUserIds;
/**
* 發(fā)送用戶id
*/
private String sendUserId;
}@Slf4j
@RestControllerAdvice
public class ExceptionHandlerConfig {

/**
* 自定義驗證異常
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
return new Results<>(false, "99999999", e.getBindingResult().getFieldErrors().stream().map(FieldError::getDefaultMessage).collect(Collectors.joining("\n")));
}
}@RestControllerAdvice與@ExceptionHandler搭配使用可以對異常進行攔截e.getBindingResult().getFieldErrors().stream().map(FieldError::getDefaultMessage)對異常進行攔截并遍歷- 返回異常
二) 包裝異常返回結(jié)果給前端,修改自定義異常
新建一個自定義異常:
public class MidRouteException extends RuntimeException {
private static final String ERROR_MESSAGE_FORMAT = "執(zhí)行路由流程異常:%s";
public MidRouteException(String error) {
super(String.format(ERROR_MESSAGE_FORMAT, error));
}
}在斷言中使用自定義異常:
public class MidAssert {
/**
* 斷言 執(zhí)行異常
*
* @param isTrue 判斷標(biāo)識
* @param message 異常信息
*/
public static void isTrueWithSqlException(boolean isTrue, String message) {
if (!isTrue) {
throw new MidRouteException(message);
}
}在全局異常處理中對異常進行操作:
/**
* 攔截MidSqlException MidSqlFrameException MidRouteException MidRouteFrameException異常
*/
@ExceptionHandler({MidSqlException.class, MidSqlFrameException.class, MidRouteException.class, MidRouteFrameException.class})
public Results<String> midRouteExceptionHandler(HttpServletRequest req, HttpServletResponse res, Exception e) {
log.error("中臺異常", e);
return new Results<>(false, "99999999", e.getMessage());
}三 返回案例

到此這篇關(guān)于SpringBoot全局異常處理方案分享的文章就介紹到這了,更多相關(guān)SpringBoot全局異常處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot中的@RestControllerAdvice注解詳解
這篇文章主要介紹了SpringBoot中的@RestControllerAdvice注解詳解,RestControllerAdvice注解用于創(chuàng)建全局異常處理類,用于捕獲和處理整個應(yīng)用程序中的異常,需要的朋友可以參考下2024-01-01
SpringMVC攔截器和異常處理器使用示例超詳細(xì)講解
攔截器(Interceptor)是一種動態(tài)攔截方法調(diào)用的機制,在SpringMVC中動態(tài)攔截控制器方法的執(zhí)行。本文將詳細(xì)講講SpringMVC中攔截器參數(shù)及攔截器鏈配置,感興趣的可以嘗試一下2022-09-09
Java實戰(zhàn)之在線寄查快遞系統(tǒng)的實現(xiàn)
這篇文章主要介紹了如何利用Java制作一個在線寄查快遞系統(tǒng),文中采用的技術(shù)有java、SpringBoot、FreeMarker、Mysql,需要的可以參考一下2022-02-02
SpringBoot系列教程之dubbo和Zookeeper集成方法
這篇文章主要介紹了SpringBoot系列教程之dubbo和Zookeeper集成方法,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09
SpringBoot中利用MyBatis進行數(shù)據(jù)操作的示例
這篇文章主要介紹了SpringBoot中利用MyBatis進行數(shù)據(jù)操作,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-09-09
Eclipse轉(zhuǎn)Itellij IDEA導(dǎo)入Git/svn本地項目的詳細(xì)步驟
這篇文章主要介紹了Eclipse轉(zhuǎn)Itellij IDEA導(dǎo)入Git/svn本地項目,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10
Spring Cloud Stream微服務(wù)消息框架原理及實例解析
這篇文章主要介紹了Spring Cloud Stream微服務(wù)消息框架原理及實例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-06
詳解MyBatis直接執(zhí)行SQL查詢及數(shù)據(jù)批量插入
這篇文章主要介紹了MyBatis直接執(zhí)行SQL查詢及數(shù)據(jù)批量插入的相關(guān)知識,需要的朋友一起學(xué)習(xí)吧2016-01-01
Java16 JDK安裝并設(shè)置環(huán)境變量的方法步驟
突然想起自己大學(xué)剛接觸java的時候,要下載JDK和配置環(huán)境變量,那時候我上網(wǎng)找了很多教學(xué),本文就詳細(xì)的介紹一下Java16 JDK安裝并設(shè)置環(huán)境變量,感興趣的可以了解一下2021-09-09

