新聞中心
對(duì)于寫Java的程序員來(lái)說(shuō),不管是寫單純的接口、還是頁(yè)面后臺(tái)一把梭,后端參數(shù)校驗(yàn)的功能都是整個(gè)代碼不可或缺的一部分,它可以從系統(tǒng)入口過(guò)濾掉一些不合法的數(shù)據(jù),以確保我們的系統(tǒng)穩(wěn)定。

專注于為中小企業(yè)提供成都網(wǎng)站制作、成都做網(wǎng)站、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)匯川免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上1000+企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
還記得我剛?cè)胄蠮ava寫后端那會(huì)兒,因?yàn)閯倧腁ndroid端轉(zhuǎn)后端開(kāi)發(fā),對(duì)對(duì)端開(kāi)發(fā)還不是很熟悉。有天我們架構(gòu)師老大給了我一個(gè)需求、要寫一個(gè)接口給客戶端調(diào)用,功能其實(shí)挺簡(jiǎn)單:就是根據(jù)客戶端傳過(guò)來(lái)的一些參數(shù)去數(shù)據(jù)庫(kù)查數(shù)據(jù),再返回給客戶端。
我雖然作為一個(gè)后端萌新,但畢竟寫代碼的底子還在啊!很快我就完成了,自己測(cè)試一下完美通過(guò),立刻提交代碼、并主動(dòng)叫我們老大Code review,我心里還指著我們老大能夸我一頓、說(shuō)我寫得真快呢!
沒(méi)想到我們老大只看了一眼就把我提交的代碼打回來(lái)了,我記得當(dāng)時(shí)我的代碼差不多是這樣寫的:
我自問(wèn)寫的代碼沒(méi)問(wèn)題,就找老大問(wèn)他我的代碼沒(méi)問(wèn)題怎么給我打回來(lái)了?只見(jiàn)老大一臉無(wú)奈地看著我說(shuō):功能是沒(méi)問(wèn)題,就是寫的太丑陋了點(diǎn)。好吧,我承認(rèn)代碼寫的是長(zhǎng)了點(diǎn)、亂了點(diǎn),可那是因?yàn)榻涌趨?shù)太多,不得一個(gè)個(gè)校驗(yàn)一下嗎?
說(shuō)到這里,老大微微一笑說(shuō):來(lái),教你一招。只見(jiàn)老大手指上下翻飛,三兩下就我的校驗(yàn)參數(shù)地代碼全刪完了,重構(gòu)完地代碼瞬間清爽了許多:
老大得意的對(duì)我說(shuō):看起來(lái)不錯(cuò)吧?不要你晚上加個(gè)班熟悉一下Spring Validation機(jī)制吧?寶寶心里苦??!
下面我們就一起來(lái)看看Spring Validation怎么使用吧。
首先添加POM依賴
新建一個(gè)Spring Boot項(xiàng)目,并在pom.xml文件添加依賴:
需要特別注意的一點(diǎn)是:如果我們項(xiàng)目中引入了spring-boot-starter-web依賴,那么它會(huì)自動(dòng)依賴spring-boot-starter-validation,無(wú)需我們?cè)偈謩?dòng)添加依賴,防止出現(xiàn)一些版本兼容的問(wèn)題。
添加約束注解
在接收參數(shù)的UserReq實(shí)體類對(duì)應(yīng)的屬性上加上約束注解:
注意點(diǎn):
- 每個(gè)約束注解都有一個(gè)message元素,用于校驗(yàn)失敗時(shí)的提示信息
- 一個(gè)屬性可以添加多個(gè)約束注解,所有注解是與的關(guān)系,必須全部驗(yàn)證通過(guò)
- 可以使用正則表達(dá)式校驗(yàn)參數(shù)
眼尖的同學(xué)可能會(huì)發(fā)現(xiàn)上面代碼中用到的一些約束注解一些是引用自javax.validation.constraints包下,還有一些引用自org.hibernate.validator.constraints包下,這是怎么一回事呢?
說(shuō)到這里,不得不提一下JSR-303,JSR-303是JAVA EE(現(xiàn)改名為:Jakarta EE)中的一項(xiàng)子規(guī)范,叫Bean Validation,它定義了一些實(shí)體和方法驗(yàn)證的約束和接口規(guī)范,而Hibernate Validator對(duì)Bean Validation規(guī)范中所有內(nèi)置約束注解都提供了實(shí)現(xiàn),并且還添加了一些額外的約束注解。
Bean Validation中內(nèi)置的約束注解:
Hibernate Validator中添加的約束注解:
值得一提的是:在Hibernate Validator中額外添加的一些優(yōu)秀的約束注解比如@Email、@NotEmpty、@NotBlank已經(jīng)被吸收到Bean Validation標(biāo)準(zhǔn)約束注解中,所有我們?cè)诖a中Import時(shí)應(yīng)盡量使用javax.validation.constraints包下的約束注解。
怎么使用呢?
接收參數(shù)的實(shí)體類我們已經(jīng)改造好了,但是還不能實(shí)現(xiàn)校驗(yàn)的功能,還需要對(duì)Controller進(jìn)行改造:
- 在接收方法的參數(shù)前面加上@Validated注解,當(dāng)然也可以加@Valid注解
- 想要獲取參數(shù)校驗(yàn)的結(jié)果,則需要進(jìn)行校驗(yàn)的參數(shù)后面緊跟一個(gè)BingingResult類型的參數(shù),用來(lái)綁定校驗(yàn)結(jié)果
關(guān)于第一點(diǎn),@Validated注解由Spring框架提供,可以說(shuō)是對(duì)JSR-303規(guī)范標(biāo)準(zhǔn)注解@Valid的封裝,可以提供額外的例如分組校驗(yàn)的功能。實(shí)際上任何以"Valid"開(kāi)頭的注解都可以實(shí)現(xiàn)同樣的效果(至于原因有機(jī)會(huì)專門寫一篇講一下,感興趣的可以關(guān)注一下)
至于第二點(diǎn),為什么校驗(yàn)結(jié)果會(huì)自動(dòng)綁定到后面緊跟的BingingResult對(duì)象,這里面涉及到Spring DataBinder數(shù)據(jù)綁定相關(guān)的知識(shí)(以后會(huì)專門講解,感興趣的可以關(guān)注一下),現(xiàn)在我們只需要知道這樣寫就行。
請(qǐng)求測(cè)試
現(xiàn)在我們使用Postman工具來(lái)請(qǐng)求我們的接口:
然后我們打上斷點(diǎn)來(lái)調(diào)試一下bindingResult對(duì)象:
可以看到bindingResult對(duì)象成功綁定并返回了三個(gè)屬性校驗(yàn)失敗的結(jié)果。
分組校驗(yàn)
我們寫業(yè)務(wù)時(shí)通常會(huì)存在一種情況:新增操作時(shí)通常不需要校驗(yàn)參數(shù)Id,而在修改或刪除操作時(shí)我們又需要校驗(yàn)參數(shù)Id,那么對(duì)于同一個(gè)參數(shù)接收類UserReq,我們要怎么處理呢?
很簡(jiǎn)單,首先我們新建一個(gè)更新分組,只需要一個(gè)普普通通的接口類就行:
接著我們?cè)赨serReq類里新增一個(gè)id屬性,同時(shí)加上@NotNull分組校驗(yàn):
groups支持傳入一個(gè)數(shù)組,可以傳入多個(gè)分組,對(duì)于id屬性來(lái)說(shuō),在更新和刪除操作時(shí)我們都需要校驗(yàn)該屬性。
最后,在Controller里更新接口方法中添加校驗(yàn)分組:
我們只需要在注解中加上需要校驗(yàn)的Update分組就行啦。
文章標(biāo)題:程序員寫接口參數(shù)校驗(yàn),總是太多ifelse?一招讓你避免體力活
文章出自:http://www.dlmjj.cn/article/coiepej.html


咨詢
建站咨詢
