SpringBoot如何進(jìn)行業(yè)務(wù)校驗(yàn)實(shí)例詳解
前言
今天繼續(xù)來(lái)聊聊在SpringBoot項(xiàng)目中如何實(shí)現(xiàn)業(yè)務(wù)異常校驗(yàn)Assert。
希望通過(guò)今天的文章,咱們能夠了解到:
如何使用Assert參數(shù)校驗(yàn)?
為什么用了Validator參數(shù)校驗(yàn),還必須再用Assert參數(shù)校驗(yàn)?
首先我們來(lái)看看為什么需要Assert?
為什么需要Assert?
Assert翻譯為中文為"斷言",它是spring的一個(gè)util類,org.springframework.util.Assert
一般用來(lái)斷定某一個(gè)實(shí)際的值是否為自己預(yù)期想得到的,如果不一樣就拋出異常。
在前面的文章中我們?cè)敿?xì)介紹了SpringBoot中如何集成參數(shù)校驗(yàn)Validator,那既然有了Validator為什么還需要Assert呢?
主要原因有兩個(gè):
因?yàn)閂alidator只解決了參數(shù)自身的數(shù)據(jù)校驗(yàn),解決不了參數(shù)和業(yè)務(wù)數(shù)據(jù)之間校驗(yàn)。
例如以下代碼,Validator是搞不定的。
public?void?test1(int?accountId)?{ ????Account?account?=?accountDao.selectById(accountId); ????if?(account?==?null)?{ ????????throw?new?IllegalArgumentException("用戶不存在!"); ????} }
采用Assert能使代碼更優(yōu)雅,更簡(jiǎn)潔。
還是上面的例子,如果采用Assert可以這樣寫(xiě):
public?void?test2(int?accountId)?{ ????Account?account?=?accountDao.selectById(accountId); ????Assert.notNull(account,?"用戶不存在!"); }
如何使用Assert?
在SpringBoot中使用Assert非常簡(jiǎn)單,直接使用Assert提供的靜態(tài)方法即可。
@RestController @RequestMapping("assert") @Slf4j public?class?AssertController?{ ????@DeleteMapping("/user/{id}") ????public?void?deleteUser(@PathVariable("id")?String?id)?{ ????????//模擬數(shù)據(jù)庫(kù)查詢用戶 ????????UserVO?user?=?getUserById(id); ????????Assert.notNull(user,?"用戶不存在!"); ????} ????private?UserVO?getUserById(String?id)?{ ????????return?null; ????} }
如上,AssertController有一個(gè)刪除用戶的接口,當(dāng)刪除用戶時(shí)我們需要先校驗(yàn)用戶是否存在。這里直接使用Assert.notNull()
進(jìn)行UserVO
的非空校驗(yàn)。
此時(shí)訪問(wèn)接口,返回的json對(duì)象如下:
{ ??"timestamp":?"2022-01-10T14:17:13.335+00:00", ??"status":?500, ??"error":?"Internal?Server?Error", ??"message":?"", ??"path":?"/assert/user/javadaily" }
從測(cè)試結(jié)果來(lái)看,assert拋出的異常是springboot原生json對(duì)象,很明顯我們必須將其加入全局異常攔截器RestExceptionHandler
。
加入全局異常攔截器
查看Assert.notNull()
方法,可以看到Assert拋出的是IllegalArgumentException
異常,所以我們只需要在全局異常攔截器中加入IllegalArgumentException
攔截即可。
/** ??*?Assert異常 ??*/ @ExceptionHandler(IllegalArgumentException.class) @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) public?ResultData<String>?exception(IllegalArgumentException?e)?{ ??return?ResultData.fail(ReturnCode.ILLEGAL_ARGUMENT.getCode(),e.getMessage()); }
此時(shí)再次訪問(wèn)接口,返回的數(shù)據(jù)結(jié)果為:
{ ??"status":?3001, ??"message":?"用戶不存在!", ??"data":?null, ??"timestamp":?1641825258876 }
符合結(jié)果預(yù)期。
常見(jiàn)的Assert使用場(chǎng)景
邏輯斷言
isTrue()
如果條件為假拋出IllegalArgumentException 異常。state()
該方法與isTrue一樣,但拋出IllegalStateException異常。
對(duì)象和類型斷言
notNull()
通過(guò)notNull()方法可以假設(shè)對(duì)象不null:isNull()
用來(lái)檢查對(duì)象為null:isInstanceOf()
使用isInstanceOf()方法檢查對(duì)象必須為另一個(gè)特定類型的實(shí)例isAssignable()
使用Assert.isAssignable()方法檢查類型
文本斷言
hasLength()
如果檢查字符串不是空符串,意味著至少包含一個(gè)空白,可以使用hasLength()方法。hasText()
我們能增強(qiáng)檢查條件,字符串至少包含一個(gè)非空白字符,可以使用hasText()方法。doesNotContain()
我們能通過(guò)doesNotContain()方法檢查參數(shù)不包含特定子串。
Collection和map斷言
Collection應(yīng)用
notEmpty()
如其名稱所示,notEmpty()方法斷言collection不空,意味著不是null并包含至少一個(gè)元素。map應(yīng)用
notEmpty()
同樣的方法重載用于map,檢查map不null,并至少包含一個(gè)entry(key,value鍵值對(duì))。
數(shù)組斷言
notEmpty()
notEmpty()方法可以檢查數(shù)組不null,且至少包括一個(gè)元素:noNullElements()
noNullElements()方法確保數(shù)組不包含null元素
小結(jié)
Assert斷言,可以替換傳統(tǒng)的if判斷,大量減少業(yè)務(wù)參數(shù)校驗(yàn)的代碼行數(shù),提高程序的可讀性,這種風(fēng)格是目前比較流行的方式。
總結(jié)
到此這篇關(guān)于SpringBoot如何進(jìn)行業(yè)務(wù)校驗(yàn)的文章就介紹到這了,更多相關(guān)SpringBoot業(yè)務(wù)校驗(yàn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
自定義的Troop<T>泛型類( c++, java和c#)的實(shí)現(xiàn)代碼
這篇文章主要介紹了自定義的Troop<T>泛型類( c++, java和c#)的實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2017-05-05PowerJob的OmsLogHandler工作流程源碼解析
這篇文章主要為大家介紹了PowerJob的OmsLogHandler工作流程源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12十五道tomcat面試題,為數(shù)不多的機(jī)會(huì)!
這篇文章主要介紹了十五道tomcat面試題,Tomcat的本質(zhì)是一個(gè)Servlet容器。一個(gè)Servlet能做的事情是:處理請(qǐng)求資源,并為客戶端填充response對(duì)象,需要的朋友可以參考下2021-08-08Java實(shí)現(xiàn)微信支付的項(xiàng)目實(shí)踐
最近的一個(gè)項(xiàng)目中涉及到了支付業(yè)務(wù),其中用到了微信支付和支付寶支付,本文就來(lái)介紹一下Java實(shí)現(xiàn)微信支付的項(xiàng)目實(shí)踐,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10spring boot 開(kāi)發(fā)soap webservice的實(shí)現(xiàn)代碼
這篇文章主要介紹了spring boot 開(kāi)發(fā)soap webservice的實(shí)現(xiàn)代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-01-01ocp開(kāi)閉原則_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了ocp開(kāi)閉原則的相關(guān)資料,ocp開(kāi)閉原則指導(dǎo)我們?nèi)绾谓⒁粋€(gè)穩(wěn)定的、靈活的系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08構(gòu)建多模塊的Spring Boot項(xiàng)目步驟全紀(jì)錄
這篇文章主要給大家介紹了關(guān)于如何構(gòu)建多模塊的Spring Boot項(xiàng)目的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用SpringBoot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05mybatisplus 的SQL攔截器實(shí)現(xiàn)關(guān)聯(lián)查詢功能
大家都知道m(xù)ybatisplus不支持關(guān)聯(lián)查詢,后來(lái)學(xué)習(xí)研究發(fā)現(xiàn)mybatisplus的SQL攔截器可以實(shí)現(xiàn)這一操作,下面小編給大家分享我的demo實(shí)現(xiàn)基本的關(guān)聯(lián)查詢功能沒(méi)有問(wèn)題,對(duì)mybatisplus關(guān)聯(lián)查詢相關(guān)知識(shí)感興趣的朋友一起看看吧2021-06-06重新啟動(dòng)IDEA時(shí)maven項(xiàng)目SSM框架文件變色所有@注解失效
這篇文章主要介紹了重新啟動(dòng)IDEA時(shí)maven項(xiàng)目SSM框架文件變色所有@注解失效,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03