SpringBoot全局異常處理方案分享
一 業(yè)務(wù)場(chǎng)景
調(diào)用接口時(shí)需要對(duì)屬性進(jìn)行校驗(yàn),比如屬性長(zhǎng)度,當(dāng)屬性為郵箱時(shí)校驗(yàn)郵箱格式等,這時(shí)候要要用到@Validated
注解,在使用這個(gè)注解后發(fā)現(xiàn)出現(xiàn)了一個(gè)問(wèn)題,調(diào)用接口后并沒(méi)有返回我們想要的報(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 [消息長(zhǎng)度不能大于500個(gè)字符]] ]
原因是異常攔截字符串太長(zhǎng),這時(shí)候我們需要定義全局異常處理,來(lái)多系統(tǒng)拋出的異常進(jìn)行攔截處理
二 全局系統(tǒng)異常類
一)全局系統(tǒng)異常類
@Data public class IMMessageSend { /** * 發(fā)送消息信息 */ @Length(max = 500,message = "消息長(zhǎng)度不能大于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)文章
Java Swing中的表格(JTable)和樹(shù)(JTree)組件使用實(shí)例
這篇文章主要介紹了Java Swing中的表格(JTable)和樹(shù)(JTree)組件使用實(shí)例,本文同時(shí)講解了表格和樹(shù)的基本概念、常用方法、代碼實(shí)例,需要的朋友可以參考下2014-10-10springboot使用redis對(duì)單個(gè)對(duì)象進(jìn)行自動(dòng)緩存更新刪除的實(shí)現(xiàn)
本文主要介紹了springboot使用redis對(duì)單個(gè)對(duì)象進(jìn)行自動(dòng)緩存更新刪除的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08SpringBoot中的Condition包下常用條件依賴注解案例介紹
這篇文章主要介紹了SpringBoot中的Condition包下常用條件依賴注解案例,文章基于Java的相關(guān)資料展開(kāi)主題詳細(xì)內(nèi)容,需要的小伙伴可以參考一下2022-04-04