情景:需要對(duì)string類型的屬性比如description進(jìn)行驗(yàn)證,驗(yàn)證規(guī)則是當(dāng)description為空時(shí)不進(jìn)行正則校驗(yàn),description不為空時(shí)進(jìn)行正則校驗(yàn)。上述需求hibernate validation沒(méi)有可用于上述需求的注解,故自定義一個(gè)注解并自定義校驗(yàn)規(guī)則。
自定義注解進(jìn)行校驗(yàn)的步驟
- 寫(xiě)一個(gè)校驗(yàn)注解,在注解中指定校驗(yàn)器類,校驗(yàn)注解與校驗(yàn)器一般一一對(duì)應(yīng)。
- 寫(xiě)一個(gè)校驗(yàn)器類并在校驗(yàn)器類中寫(xiě)校驗(yàn)邏輯,校驗(yàn)器必須實(shí)現(xiàn)constraintvalidator<?, ?>接口,第一個(gè)參數(shù)是對(duì)應(yīng)的注解,第二個(gè)參數(shù)是要校驗(yàn)的屬性的類型
代碼示例
校驗(yàn)注解
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
40
41
42
43
44
45
|
package com.kunlun.validation.annotation; import java.lang.annotation.documented; import java.lang.annotation.elementtype; import java.lang.annotation.retention; import java.lang.annotation.retentionpolicy; import java.lang.annotation.target; import javax.validation.constraint; import javax.validation.payload; import com.kunlun.validation.validator.klpatternvalidator; /** * 自定義的校驗(yàn)注解 * 規(guī)則: * 1.如果字符串為空串或者為null,則不進(jìn)行正則校驗(yàn) * 2.如果字符串不為空串,則必須進(jìn)行正則校驗(yàn) * @author xc * @date 2018年1月19日上午11:38:02 */ @documented // 指定該注解可以使用的地方 @target (value= {elementtype.field}) @retention (retentionpolicy.runtime) // 指定實(shí)際進(jìn)行校驗(yàn)的校驗(yàn)器,該校驗(yàn)器是自己寫(xiě)的且必須實(shí)現(xiàn)constraintvalidator接口 @constraint (validatedby=klpatternvalidator. class ) public @interface klpattern { /* * 用于驗(yàn)證的注解下列這三個(gè)方法必須要,這是hibernate validation框架要求的,否則程序再在調(diào)用的時(shí)候會(huì)報(bào)錯(cuò) * default用于對(duì)屬性給定默認(rèn)值 * 如果不給定默認(rèn)值,則在使用注解的時(shí)候必須給屬性指定屬性值,否則報(bào)錯(cuò) * 給定默認(rèn)值時(shí),在使用注解的時(shí)候可以不用指定屬性值 */ string message() default "不符合正則!" ; class <?>[] groups() default {}; class <? extends payload>[] payload() default {}; // 沒(méi)加default給定默認(rèn)值,使用注解的時(shí)候該屬性必須賦值,否則報(bào)錯(cuò) string regex(); // value屬性,加上了default "mercy" 使得該屬性在使用注解的時(shí)候可以不用輸入也不會(huì)報(bào)錯(cuò) string value() default "mercy" ; } |
與上面校驗(yàn)注解對(duì)應(yīng)的校驗(yàn)器類
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
40
41
42
43
44
45
46
47
|
package com.kunlun.validation.validator; import javax.validation.constraintvalidator; import javax.validation.constraintvalidatorcontext; import com.kunlun.validation.annotation.klpattern; /** * klpatternvalidator是klpattern注解實(shí)際調(diào)用的驗(yàn)證器 * 在klpatternvalidator中完成校驗(yàn)邏輯 * * @author xc * @date 2018年1月19日上午11:44:38 */ public class klpatternvalidator implements constraintvalidator<klpattern, string> { private string regex; /** * 通過(guò)initialize()可以獲取注解里的屬性值 */ @override public void initialize(klpattern constraintannotation) { constraintvalidator. super .initialize(constraintannotation); regex = constraintannotation.regex(); } /** * 實(shí)際驗(yàn)證邏輯 * 返回值為true表示驗(yàn)證通過(guò), * 返回值為false表示驗(yàn)證未通過(guò) */ @override public boolean isvalid(string s, constraintvalidatorcontext ctx) { // 當(dāng)前前端傳過(guò)來(lái)的請(qǐng)求參數(shù)是空串,或者沒(méi)傳的時(shí)候,不進(jìn)行后續(xù)正則校驗(yàn) if ( "" .equals(s) || s == null ) { return true ; } // 進(jìn)行正則校驗(yàn) if (s.matches(regex)) { return true ; } return false ; } } |
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。
原文鏈接:https://blog.csdn.net/cccmercy/article/details/79105624