前言
接觸springboot一年多,是時(shí)候擺脫這種校驗(yàn)方式了233 ,每個(gè)參數(shù)都if判斷,一眼看過(guò)去就是很low的程序員。
validation有了這個(gè)插件就再也不用這樣去校驗(yàn)參數(shù)了,可以讓我們?cè)陧?xiàng)目中不用浪費(fèi)很多時(shí)間在參數(shù)校驗(yàn)這里,從而更專注于業(yè)務(wù)邏輯
正文
首先引入依賴
1
2
3
4
|
<dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-web</artifactid> </dependency> |
這里創(chuàng)建一個(gè)用戶的dto對(duì)象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
@data @apimodel ( "用戶-表單對(duì)象" ) public class sportsusercreatform{ @apimodelproperty (value= "用戶唯一標(biāo)識(shí)" ,example = "0" ) @notnull (groups = {update. class }) private long id; @apimodelproperty (value = "所屬機(jī)構(gòu)唯一標(biāo)識(shí)(冗余字段)" , example = "0" ) private long organizationid; @apimodelproperty ( "登錄用戶名" ) @notblank (message = "用戶名不能為空" ) @length (max = 10 , message = "用戶名最長(zhǎng)為10位" ) private string loginname; @apimodelproperty ( "密碼" ) private string password; @apimodelproperty ( "手機(jī)號(hào)" ) private string phone; @apimodelproperty ( "郵箱" ) private string email; @apimodelproperty ( "性別( 'male', 'female' )" ) @notnull (message = "用戶性別不能為空" ) private sportsuserenumgender gander; @apimodelproperty (value = "出生日期-13位時(shí)間戳" ,example = "0" ) private long birthday; @apimodelproperty ( "身份證號(hào)" ) private string idnumber; @apimodelproperty ( "用戶昵稱" ) private string nickname; } |
在controller層添加@validated注解,添加注解之后spring就會(huì)逐個(gè)校驗(yàn)dto中加了校驗(yàn)注解的字段,完全通過(guò)才可以進(jìn)入業(yè)務(wù)處理,否則就會(huì)拋出methodargumentnotvalidexception異常
1
2
3
4
5
6
|
@postmapping ( "user/add" ) @requiresauthentication @apioperation ( "添加用戶" ) public sportsuser adduser( @validated @requestbody sportsusercreatform user) throws exception{ return userbiz.adduser(user); } |
一般項(xiàng)目來(lái)說(shuō)拋出異常都會(huì)有約定好的json格式返回錯(cuò)誤碼和錯(cuò)誤信息,如果不處理就無(wú)法按照約定格式返回。這里我們可以通過(guò)聲明全局異常處理類來(lái)攔截異常并將異常處理成前端能操作的json數(shù)據(jù)。(這里只需要關(guān)注methodargumentnotvalidexception異常)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
@slf4j @order (ordered.highest_precedence) @restcontrolleradvice public class globalexceptionadvice { @exceptionhandler (methodargumentnotvalidexception. class ) @responsebody public responseentity<object> handlebeanvalidation(httpservletresponse res, methodargumentnotvalidexception e) throws exception{ res.setstatus(httpstatus.ok.value()); list<objecterror> errors = e.getbindingresult().getallerrors(); objecterror error = errors.get( 0 ); // 如果有多個(gè)異常,這里只取第一個(gè)異常。沒(méi)有必要把所有異常都拋出(錯(cuò)就是錯(cuò),第一個(gè)校驗(yàn)都沒(méi)通過(guò),自然也輪不到第二個(gè)校驗(yàn)。) string json = jsonutils.obj2json(error); map map = jsonutils.json2map(json); okmessage result = new okmessage(); result.setmsg( "請(qǐng)求參數(shù)錯(cuò)誤" e.getbindingresult().getfielderror().getdefaultmessage() + "]" ); result.setcode( "param-000001" ); return new responseentity<>(result, httpstatus.ok); } } |
分組校驗(yàn)
有的人就要發(fā)問(wèn)了,"啊,你這校驗(yàn)不行啊,我在添加的時(shí)候id是自動(dòng)生成的不需要校驗(yàn),編輯的時(shí)候就需要校驗(yàn)id了,我是不是要建兩個(gè)一模一樣的dto,這樣豈不是顯得我很憨?!這不是增加無(wú)用代碼嗎?差評(píng)!"
其實(shí)不然,在此我們可以用到 groups 屬性來(lái)解決此場(chǎng)景下的問(wèn)題。
聲明分組
注意:在聲明分組的時(shí)候盡量繼承 extend javax.validation.groups.default。 否則,在你聲明@validated(update.class)的時(shí)候,就會(huì)出現(xiàn)你在默認(rèn)沒(méi)添加groups = {}的時(shí)候的校驗(yàn)組@email(message = "郵箱格式不對(duì)")不會(huì)自動(dòng)校驗(yàn),因?yàn)槟J(rèn)的校驗(yàn)組是groups = {default.class}。
1
2
3
4
5
6
7
8
|
import javax.validation.groups. default ; /** * 數(shù)據(jù)新增分組 */ public interface create extends default { } |
1
2
3
4
5
6
7
8
|
import javax.validation.groups. default ; /** * 數(shù)據(jù)更新分組 */ public interface update extends default { } |
修改controller中的@validated注解,聲明校驗(yàn)分組(下面用的是create.class所以并不會(huì)校驗(yàn)id)
1
2
3
4
5
6
|
@postmapping ( "user/add" ) @requiresauthentication @apioperation ( "添加用戶" ) public sportsuser adduser( @validated (create. class ) @requestbody sportsusercreatform user) throws exception{ return userbiz.adduser(user); } |
下面附上注解說(shuō)明
驗(yàn)證注解 | 驗(yàn)證的數(shù)據(jù)類型 | 說(shuō)明 |
---|---|---|
@assertfalse | boolean,boolean | 驗(yàn)證注解的元素值是false |
@asserttrue | boolean,boolean | 驗(yàn)證注解的元素值是true |
@notnull | 任意類型 | 驗(yàn)證注解的元素值不是null |
@null | 任意類型 | 驗(yàn)證注解的元素值是null |
@min(value=值) | bigdecimal,biginteger, byte,short, int, long,等任何number或charsequence(存儲(chǔ)的是數(shù)字)子類型 | 驗(yàn)證注解的元素值大于等于@min指定的value值 |
@max(value=值) | 和@min要求一樣 | 驗(yàn)證注解的元素值小于等于@max指定的value值 |
@decimalmin(value=值) | 和@min要求一樣 | 驗(yàn)證注解的元素值大于等于@ decimalmin指定的value值 |
@decimalmax(value=值) | 和@min要求一樣 | 驗(yàn)證注解的元素值小于等于@ decimalmax指定的value值 |
@digits(integer=整數(shù)位數(shù), fraction=小數(shù)位數(shù)) | 和@min要求一樣 | 驗(yàn)證注解的元素值的整數(shù)位數(shù)和小數(shù)位數(shù)上限 |
@size(min=下限, max=上限) | 字符串、collection、map、數(shù)組等 | 驗(yàn)證注解的元素值的在min和max(包含)指定區(qū)間之內(nèi),如字符長(zhǎng)度、集合大小 |
@past | java.util.date,java.util.calendar;joda time類庫(kù)的日期類型 | 驗(yàn)證注解的元素值(日期類型)比當(dāng)前時(shí)間早 |
@future | 與@past要求一樣 | 驗(yàn)證注解的元素值(日期類型)比當(dāng)前時(shí)間晚 |
@notblank | charsequence子類型 | 驗(yàn)證注解的元素值不為空(不為null、去除首位空格后長(zhǎng)度為0),不同于@notempty,@notblank只應(yīng)用于字符串且在比較時(shí)會(huì)去除字符串的首位空格 |
@length(min=下限, max=上限) | charsequence子類型 | 驗(yàn)證注解的元素值長(zhǎng)度在min和max區(qū)間內(nèi) |
@notempty | charsequence子類型、collection、map、數(shù)組 | 驗(yàn)證注解的元素值不為null且不為空(字符串長(zhǎng)度不為0、集合大小不為0) |
@range(min=最小值, max=最大值) | bigdecimal,biginteger,charsequence, byte, short, int, long等原子類型和包裝類型 | 驗(yàn)證注解的元素值在最小值和最大值之間 |
@email(regexp=正則表達(dá)式,flag=標(biāo)志的模式) | charsequence子類型(如string) | 驗(yàn)證注解的元素值是email,也可以通過(guò)regexp和flag指定自定義的email格式 |
@pattern(regexp=正則表達(dá)式,flag=標(biāo)志的模式) | string,任何charsequence的子類型 | 驗(yàn)證注解的元素值與指定的正則表達(dá)式匹配 |
@valid | 任何非原子類型 | 指定遞歸驗(yàn)證關(guān)聯(lián)的對(duì)象如用戶對(duì)象中有個(gè)地址對(duì)象屬性,如果想在驗(yàn)證用戶對(duì)象時(shí)一起驗(yàn)證地址對(duì)象的話,在地址對(duì)象上加@valid注解即可 |
此處只列出hibernate validator提供的大部分驗(yàn)證約束注解,請(qǐng)參考hibernate validator官方文檔了解其他驗(yàn)證約束注解和進(jìn)行自定義的驗(yàn)證約束注解定義。
1
2
3
4
|
常用的幾個(gè): 1 . @notnull :不能為 null ,但可以為empty( "" , " " , " " ) 2 . @notempty :不能為 null ,而且長(zhǎng)度必須大于 0 ( " " , " " ) 3 . @notblank :只能作用在string上,不能為 null ,而且調(diào)用trim()后,長(zhǎng)度必須大于 0 ( "test" ) 即:必須有實(shí)際字符 |
總結(jié)
到此這篇關(guān)于spring boot validation校驗(yàn)的文章就介紹到這了,更多相關(guān)springboot validation校驗(yàn)內(nèi)容請(qǐng)搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!
原文鏈接:https://blog.csdn.net/qq_25533359/article/details/113866279