SpringBoot全局異常處理方案分享
一 業(yè)務(wù)場(chǎng)景
調(diào)用接口時(shí)需要對(duì)屬性進(jìn)行校驗(yàn),比如屬性長度,當(dāng)屬性為郵箱時(shí)校驗(yàn)郵箱格式等,這時(shí)候要要用到@Validated注解,在使用這個(gè)注解后發(fā)現(xiàn)出現(xiàn)了一個(gè)問題,調(diào)用接口后并沒有返回我們想要的報(bào)錯(cuò)結(jié)果,而是返回了 "message": "Validation failed for object='IMMessageSend'. Error count: 1",顯然這不是我們想要的結(jié)果,查看控制臺(tái)打印,發(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個(gè)字符]] ]
原因是異常攔截字符串太長,這時(shí)候我們需要定義全局異常處理,來多系統(tǒng)拋出的異常進(jìn)行攔截處理
二 全局系統(tǒng)異常類
一)全局系統(tǒng)異常類
@Data
public class IMMessageSend {
/**
* 發(fā)送消息信息
*/
@Length(max = 500,message = "消息長度不能大于500個(gè)字符")
private String msg;
/**
* 接收用戶id集合
*/
private List<String> receiveUserIds;
/**
* 發(fā)送用戶id
*/
private String sendUserId;
}@Slf4j
@RestControllerAdvice
public class ExceptionHandlerConfig {

/**
* 自定義驗(yàn)證異常
*/
@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搭配使用可以對(duì)異常進(jìn)行攔截e.getBindingResult().getFieldErrors().stream().map(FieldError::getDefaultMessage)對(duì)異常進(jìn)行攔截并遍歷- 返回異常
二) 包裝異常返回結(jié)果給前端,修改自定義異常
新建一個(gè)自定義異常:
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)識(shí)
* @param message 異常信息
*/
public static void isTrueWithSqlException(boolean isTrue, String message) {
if (!isTrue) {
throw new MidRouteException(message);
}
}在全局異常處理中對(duì)異常進(jìn)行操作:
/**
* 攔截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("中臺(tái)異常", e);
return new Results<>(false, "99999999", e.getMessage());
}三 返回案例

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

