6
6
7
7
标题图:
8
8
9
- ![ img ] ( https://cdn.nlark.com/yuque/0/2024/png/29587979/1706626699303-207e877a-0c56-4568-9df4-6cd27df96670.png )
9
+ ![ ] ( https://cdn.nlark.com/yuque/0/2024/png/29587979/1706626699303-207e877a-0c56-4568-9df4-6cd27df96670.png )
10
10
11
- ![ img ] ( https://cdn.nlark.com/yuque/0/2024/jpeg/29587979/1706413828444-4b81108b-e3c1-47a5-8fe8-c8c3fd19f175.jpeg )
11
+ ![ ] ( https://cdn.nlark.com/yuque/0/2024/jpeg/29587979/1706413828444-4b81108b-e3c1-47a5-8fe8-c8c3fd19f175.jpeg )
12
12
13
13
----
14
14
@@ -66,13 +66,13 @@ public class UserRegisterParamVo {
66
66
67
67
包内还提供了很多其他类型的校验注解:
68
68
69
- ![ img ] ( https://cdn.nlark.com/yuque/0/2024/png/29587979/1705051761792-a697d06c-6059-4f10-8c07-92cdb9f5e876.png )
69
+ ![ ] ( https://cdn.nlark.com/yuque/0/2024/png/29587979/1705051761792-a697d06c-6059-4f10-8c07-92cdb9f5e876.png )
70
70
71
71
相信大家对这块也不陌生了,我就不过多介绍了,下面主要是想跟大家分享如何根据自己的需求来自定义一个这样的注解。
72
72
73
73
当然我知道可以通过很多其他的方式来解决参数校验的问题,但我觉得用注解的方式确实很舒服。
74
74
75
- ![ img ] ( https://cdn.nlark.com/yuque/0/2024/png/29587979/1705052427491-e1beeb3d-18bb-414e-9c9b-2ccf46ac4536.png )
75
+ ![ ] ( https://cdn.nlark.com/yuque/0/2024/png/29587979/1705052427491-e1beeb3d-18bb-414e-9c9b-2ccf46ac4536.png )
76
76
77
77
# 2. 为什么需要自定义
78
78
@@ -92,17 +92,17 @@ javax.validation 提供了扩展的方法,用户完全可以自定义一个和
92
92
93
93
我们先来观察一下 NotNull 这个注解的源码:
94
94
95
- ![ img ] ( https://cdn.nlark.com/yuque/0/2024/png/29587979/1705053153160-e0e1b501-240f-497f-a892-195458b60c0b.png )
95
+ ![ ] ( https://cdn.nlark.com/yuque/0/2024/png/29587979/1705053153160-e0e1b501-240f-497f-a892-195458b60c0b.png )
96
96
97
97
注意到` @Constraint(validatedBy = { }) ` 这个注解了吗?Constant这个单词的意思是“约束”,validatedBy的意思是“通过....验证”,很明显它和参数校验沾点关系。
98
98
99
99
我们来看下 @Constraint 的描述信息:
100
100
101
- ![ img ] ( https://cdn.nlark.com/yuque/0/2024/png/29587979/1705053172105-48e4802a-ac83-476f-83b1-5dd6d85585b6.png )
101
+ ![ ] ( https://cdn.nlark.com/yuque/0/2024/png/29587979/1705053172105-48e4802a-ac83-476f-83b1-5dd6d85585b6.png )
102
102
103
103
一堆英文,没好好学英语的同学肯定看不懂吧?
104
104
105
- ![ img ] ( https://cdn.nlark.com/yuque/0/2024/png/29587979/1705065662943-fea3448e-b9db-4dba-b71e-1554457f5e42.png )
105
+ ![ ] ( https://cdn.nlark.com/yuque/0/2024/png/29587979/1705065662943-fea3448e-b9db-4dba-b71e-1554457f5e42.png )
106
106
107
107
我也看不懂😅。
108
108
@@ -120,15 +120,15 @@ javax.validation 提供了扩展的方法,用户完全可以自定义一个和
120
120
121
121
注意这里又出现新目标了,来看看这个 ConstraintValidator 是什么:
122
122
123
- ![ img ] ( https://cdn.nlark.com/yuque/0/2024/png/29587979/1705057573502-5bcfeaf2-dc38-4fe6-8ff5-a9dd35f7a20c.png )
123
+ ![ ] ( https://cdn.nlark.com/yuque/0/2024/png/29587979/1705057573502-5bcfeaf2-dc38-4fe6-8ff5-a9dd35f7a20c.png )
124
124
125
125
大概意思是说,这个接口是用来定义约束注解的具体约束逻辑的,它的泛型参数为 <A extends Annotation, T>,其中 A 表示这个验证器将要用来验证的注解类,T 表示这个验证器支持验证哪些类型。
126
126
127
127
然后 initialize 用来初始化验证器,其实是提供给你获取注解参数的。
128
128
129
129
核心方法是 isValid ,它是用来实现具体验证逻辑的,其中参数 value 就是被验证的那个对象的值,验证通过就返回 true,失败就返回 false,还是很容易理解的。
130
130
131
- ![ img ] ( https://cdn.nlark.com/yuque/0/2024/png/29587979/1705065746697-aca51789-2763-48dc-a4a5-7dc0164b75f2.png )
131
+ ![ ] ( https://cdn.nlark.com/yuque/0/2024/png/29587979/1705065746697-aca51789-2763-48dc-a4a5-7dc0164b75f2.png )
132
132
133
133
好,那么好,看到这一步,其实已经基本明确了我们该如何自定义一个约束注解类。
134
134
@@ -144,7 +144,7 @@ javax.validation 提供了扩展的方法,用户完全可以自定义一个和
144
144
145
145
这下看懂了吧,如果还没看懂,那只能说明我的表达有问题,不用客气,在评论区吐槽就完事了。
146
146
147
- ![ img ] ( https://cdn.nlark.com/yuque/0/2024/png/29587979/1705065713441-0405739a-0105-4246-86a5-ef897c5e8189.png )
147
+ ![ ] ( https://cdn.nlark.com/yuque/0/2024/png/29587979/1705065713441-0405739a-0105-4246-86a5-ef897c5e8189.png )
148
148
149
149
# 4. 如何实现
150
150
@@ -221,7 +221,7 @@ public boolean isValid(List<String> value, ConstraintValidatorContext context) {
221
221
222
222
最后还有一步,可千万不能忘了需要用 validatedBy 来指定约束注解的验证器。我们回到 NotBlankFields ,把参数补上:
223
223
224
- ![ img ] ( https://cdn.nlark.com/yuque/0/2024/png/29587979/1705368979430-bc902bba-d42e-4d26-af4c-800cfe7e7252.png )
224
+ ![ ] ( https://cdn.nlark.com/yuque/0/2024/png/29587979/1705368979430-bc902bba-d42e-4d26-af4c-800cfe7e7252.png )
225
225
226
226
> 这里的代码我提交到了GitHub上,有需要查看源码的朋友可以查看:https://github.com/stick-i/scblogs/pull/204
227
227
@@ -264,23 +264,23 @@ public class TestParamVo {
264
264
265
265
参数值为null的情况下,校验不通过:
266
266
267
- ![ img ] ( https://cdn.nlark.com/yuque/0/2024/png/29587979/1706623980456-09a9edc6-9c96-4b8b-aabe-be1d6ebc5e7a.png )
267
+ ![ ] ( https://cdn.nlark.com/yuque/0/2024/png/29587979/1706623980456-09a9edc6-9c96-4b8b-aabe-be1d6ebc5e7a.png )
268
268
269
269
参数值为空数组的情况下,校验不通过:
270
270
271
- ![ img ] ( https://cdn.nlark.com/yuque/0/2024/png/29587979/1706623998004-48f6babf-1c24-4d06-a5b6-e6017ebb8efe.png )
271
+ ![ ] ( https://cdn.nlark.com/yuque/0/2024/png/29587979/1706623998004-48f6babf-1c24-4d06-a5b6-e6017ebb8efe.png )
272
272
273
273
参数值为三个空字符串组成的非空列表,校验不通过:
274
274
275
- ![ img ] ( https://cdn.nlark.com/yuque/0/2024/png/29587979/1706624087008-c1f4051e-376d-4071-a216-293ebbff96b5.png )
275
+ ![ ] ( https://cdn.nlark.com/yuque/0/2024/png/29587979/1706624087008-c1f4051e-376d-4071-a216-293ebbff96b5.png )
276
276
277
277
参数值中部分字符串为空字符串的情况,校验不通过:
278
278
279
- ![ img ] ( https://cdn.nlark.com/yuque/0/2024/png/29587979/1706624148503-fe236681-4aa4-45f5-b4df-a3255be40f53.png )
279
+ ![ ] ( https://cdn.nlark.com/yuque/0/2024/png/29587979/1706624148503-fe236681-4aa4-45f5-b4df-a3255be40f53.png )
280
280
281
281
参数正常的情况下,校验通过:
282
282
283
- ![ img ] ( https://cdn.nlark.com/yuque/0/2024/png/29587979/1706626074396-cad3b6ae-2fef-4a38-8c0f-0457f6d15814.png )
283
+ ![ ] ( https://cdn.nlark.com/yuque/0/2024/png/29587979/1706626074396-cad3b6ae-2fef-4a38-8c0f-0457f6d15814.png )
284
284
285
285
所有测试用例都通过了,这样的话,就已经满足我们前面所提出的条件了、
286
286
@@ -395,8 +395,8 @@ public boolean isValid(List<String> value, ConstraintValidatorContext context) {
395
395
396
396
希望你学会了之后,明天就去公司写一个,写完之后给同事亮一手!
397
397
398
- ![ img ] ( https://cdn.nlark.com/yuque/0/2024/png/29587979/1706626699303-207e877a-0c56-4568-9df4-6cd27df96670.png )
398
+ ![ ] ( https://cdn.nlark.com/yuque/0/2024/png/29587979/1706626699303-207e877a-0c56-4568-9df4-6cd27df96670.png )
399
399
400
400
看在作者这么认真的份上,建议关注趁早关注下,等我以后火了,在坐的各位就都是老粉了!
401
401
402
- ![ img ] ( https://cdn.nlark.com/yuque/0/2024/png/29587979/1706436823990-4378f9cf-5935-4d68-b6e4-a5789f250129.png )
402
+ ![ ] ( https://cdn.nlark.com/yuque/0/2024/png/29587979/1706436823990-4378f9cf-5935-4d68-b6e4-a5789f250129.png )
0 commit comments