springboot斷言異常封裝與統(tǒng)一異常處理實現(xiàn)代碼
步驟
1、異常類
package com.walker.dianping.common.exceptions; import lombok.Data; @Data //繼承RuntimeException public class BizException extends RuntimeException { private String msg; public BizException(String msg) { super(msg); //此處記得實例化 this.msg = msg; } }
2、統(tǒng)一異常處理配置類
package com.walker.dianping.common.config; import com.walker.dianping.common.exceptions.BizException; import com.walker.dianping.model.R; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; @RestControllerAdvice @Slf4j public class MyExceptionHandler { @ExceptionHandler(value = BizException.class) public R BizExceptionHandler(Exception e) { log.error("錯誤原因是:" + e.getMessage()); return R.fail("系統(tǒng)異常,原因如下:"+e.getMessage()); } @ExceptionHandler(value = Exception.class) public R exceptionHandler(Exception e) { log.error("錯誤原因是:" + e.getMessage()); return R.fail(e.getMessage()); } }
3、斷言類
可以自己進行補充
package com.walker.dianping.common.utils; import com.walker.dianping.common.exceptions.BizException; import org.apache.commons.lang3.StringUtils; public abstract class Assert { //如果字符串為空的話,就拋出異常 public static void isBlank(String str, String message) { if (StringUtils.isBlank(str)) { throw new BizException(message); } } public static void isNull(Object object, String message) { if (object == null) { throw new BizException(message); } } }
4、使用
//查詢類,如果類不存在則拋出異常 TbSeckillVoucherEntity entity = getById(voucherId); Assert.isNull(entity,"該"+voucherId+"優(yōu)惠券不存在");
可以讓代碼變得相對簡潔
接下來分別對這幾種異常處理器做詳細說明。
補充:異常處理器說明
handleServletException
一個http
請求,在到達Controller
前,會對該請求的請求信息與目標控制器信息做一系列校驗。這里簡單說一下:NoHandlerFoundException:首先根據(jù)請求Url
查找有沒有對應(yīng)的控制器,若沒有則會拋該異常,也就是大家非常熟悉的404
異常;
HttpRequestMethodNotSupportedException:若匹配到了(匹配結(jié)果是一個列表,不同的是http
方法不同,如:Get、Post等),則嘗試將請求的http
方法與列表的控制器做匹配,若沒有對應(yīng)http
方法的控制器,則拋該異常;
HttpMediaTypeNotSupportedException:然后再對請求頭與控制器支持的做比較,比如content-type
請求頭,若控制器的參數(shù)簽名包含注解@RequestBody
,但是請求的content-type
請求頭的值沒有包含application/json
,那么會拋該異常(當然,不止這種情況會拋這個異常);MissingPathVariableException:未檢測到路徑參數(shù)。比如url為:/licence/{licenceId}
,參數(shù)簽名包含@PathVariable("licenceId")
,當請求的url為/licence
,在沒有明確定義url為/licence
的情況下,會被判定為:缺少路徑參數(shù);
MissingServletRequestParameterException:缺少請求參數(shù)。比如定義了參數(shù)@RequestParam("licenceId") String licenceId,但發(fā)起請求時,未攜帶該參數(shù),則會拋該異常;TypeMismatchException: 參數(shù)類型匹配失敗。比如:接收參數(shù)為Long型,但傳入的值確是一個字符串,那么將會出現(xiàn)類型轉(zhuǎn)換失敗的情況,這時會拋該異常;
HttpMessageNotReadableException:與上面的HttpMediaTypeNotSupportedException
舉的例子完全相反,即請求頭攜帶了"content-type: application/json;charset=UTF-8"
,但接收參數(shù)卻沒有添加注解@RequestBody
,或者請求體攜帶的 json 串反序列化成 pojo 的過程中失敗了,也會拋該異常;HttpMessageNotWritableException:返回的 pojo 在序列化成 json 過程失敗了,那么拋該異常;
handleBindException
參數(shù)校驗異常,后文詳細說明。
handleValidException
參數(shù)校驗異常,后文詳細說明。
handleBusinessException、handleBaseException
處理自定義的業(yè)務(wù)異常,只是handleBaseException
處理的是除了 BusinessException
意外的所有業(yè)務(wù)異常。就目前來看,這2個是可以合并成一個的。
handleException
處理所有未知的異常,比如操作數(shù)據(jù)庫失敗的異常。
注:上面的handleServletException
、handleException
這兩個處理器,返回的異常信息,不同環(huán)境返回的可能不一樣,以為這些異常信息都是框架自帶的異常信息,一般都是英文的,不太好直接展示給用戶看,所以統(tǒng)一返回SERVER_ERROR
代表的異常信息。
總結(jié)
到此這篇關(guān)于springboot斷言異常封裝與統(tǒng)一異常處理實現(xiàn)的文章就介紹到這了,更多相關(guān)springboot斷言異常封裝內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java基礎(chǔ)之數(shù)組常用操作總結(jié)(必看篇)
下面小編就為大家?guī)硪黄猨ava基礎(chǔ)之數(shù)組常用操作總結(jié)(必看篇)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-06-06Spring?Boot統(tǒng)一接口返回及全局異常處理
這篇文章主要介紹了Spring?Boot統(tǒng)一接口返回及全局異常處理,文章圍繞主題展開相關(guān)資料,具有一定的參考價值需要的小伙伴可以參考一下2022-04-04MyBatis Plus整合Redis實現(xiàn)分布式二級緩存的問題
Mybatis內(nèi)置的二級緩存在分布式環(huán)境下存在分布式問題,無法使用,但是我們可以整合Redis來實現(xiàn)分布式的二級緩存,這篇文章給大家介紹MyBatis Plus整合Redis實現(xiàn)分布式二級緩存,感興趣的朋友跟隨小編一起看看吧2023-11-11解決springboot整合cxf-jaxrs中json轉(zhuǎn)換的問題
這篇文章主要介紹了解決springboot整合cxf-jaxrs中json轉(zhuǎn)換的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07spring boot@EnableXXXX注解編程模型講解
這篇文章主要介紹了spring boot@EnableXXXX注解編程模型,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09