15
15
1 . 在接口参数上使用 ` @Valid ` 或 ` @Validated ` 注解
16
16
2 . 在实体类上使用 ` @SpelValid ` 注解
17
17
18
+ ``` java
19
+ @RestController
20
+ @RequestMapping (" /example" )
21
+ public class ExampleController {
22
+
23
+ @PostMapping (" /simple" )
24
+ public Resp<Void > simple (@RequestBody @Valid /* 添加启动注解*/ SimpleExampleParamVo simpleExampleParamVo ) {
25
+ return Resp . ok(null );
26
+ }
27
+
28
+ }
29
+
30
+ @Data
31
+ @SpelValid /* 添加启动注解*/
32
+ public class SimpleExampleParamVo {
33
+ // ...
34
+ }
35
+ ```
36
+
18
37
如果只满足第一个条件,那么只会对带 ` @NotNull ` 、` @NotEmpty ` 、` @NotBlank ` 等注解的元素进行校验。
19
38
20
39
如果只满足第二个条件,那么不会对任何元素进行校验。
23
42
这就意味着,` @SpelValid ` 和 ` @NotNull ` 、` @NotEmpty ` 、` @NotBlank ` 等注解一样,
24
43
需要在 ` @Valid ` 或 ` @Validated ` 注解的支持下才会生效。
25
44
26
- 而 ` spel-validator ` 提供的约束注解又是在 ` @SpelValid ` 的内部进行校验的,只有在 ` @SpelValid ` 注解生效的情况下才会执行约束校验。
45
+ 而 ` SpEL Validator ` 提供的约束注解又是在 ` @SpelValid ` 的内部进行校验的,只有在 ` @SpelValid ` 注解生效的情况下才会执行约束校验。
27
46
28
- 所以,如果需要使用 ` spel-validator ` 进行校验,需要同时满足上述两个条件。
47
+ 所以,如果需要使用 ` SpEL Validator ` 进行校验,需要同时满足上述两个条件。
29
48
30
49
## 使用约束注解
31
50
48
67
- ` group ` :分组条件,支持 SpEL 表达式,当分组条件满足时,才会对带注解的元素进行校验。
49
68
- ` condition ` :约束开启条件,支持 SpEL 表达式,当 ** 表达式为空** 或 ** 计算结果为true** 时,才会对带注解的元素进行校验。
50
69
70
+ 在需要校验的字段上使用 ` @SpelNotNull ` 等约束注解。
71
+
72
+ ``` java
73
+ @Data
74
+ @SpelValid
75
+ public class SimpleExampleParamVo {
76
+
77
+ /**
78
+ * 此处使用了 @SpelNotNull 注解
79
+ * 当参数 condition 的计算结果 true 时,会启用对当前字段的约束,要求为当前字段不能为null
80
+ * 约束校验失败时,提示信息为:语音内容不能为空
81
+ */
82
+ @SpelNotNull (condition = " true" , message = " 语音内容不能为空" )
83
+ private Object audioContent;
84
+
85
+ }
86
+ ```
87
+
88
+ ## 引用上下文字段
89
+
90
+ 设计这套组件的初衷,就是为了满足一些需要判断另一个字段的值来决定当前字段是否校验的场景。
91
+
92
+ 在组件内部,将当前校验的整个类对象作为了 SpEL 表达式解析过程中的根对象,所以在表达式中可以直接引用类中的任意字段。
93
+
94
+ 通过 ` #this.fieldName ` 的方式来引用当前类对象的字段。
95
+
96
+ ``` java
97
+ @Data
98
+ @SpelValid
99
+ public class SimpleExampleParamVo {
100
+
101
+ private boolean switchAudio;
102
+
103
+ /**
104
+ * 此处引用了上面的 switchAudio 字段
105
+ * 当 switchAudio 字段的值为 true 时,才会校验 audioContent 是否为null
106
+ */
107
+ @SpelNotNull (condition = " #this.switchAudio == true" )
108
+ private Object audioContent;
109
+
110
+ }
111
+ ```
112
+
113
+ ## 分组校验
114
+
115
+ 待补充
116
+
117
+ ## 嵌套校验
118
+
119
+ 本组件支持嵌套校验,只需要在需要校验的字段上添加 ` @Valid ` ,以及在另一个类上添加 ` @SpelValid ` 注解。
120
+
121
+ ``` java
122
+ @Data
123
+ @SpelValid
124
+ public class TestParamVo {
125
+
126
+ private Boolean switchVoice;
127
+
128
+ @SpelNotNull (condition = " #this.switchVoice == true" )
129
+ private Object voiceContent;
130
+
131
+ @Valid
132
+ private TestParamVo2 testParamVo2;
133
+
134
+ }
135
+
136
+ @Data
137
+ @SpelValid /* 在此处添加注解*/
138
+ public class TestParamVo2 {
139
+
140
+ @SpelNotNull
141
+ private Object object;
142
+
143
+ }
144
+ ```
145
+
146
+ 或者将 ` @SpelValid ` 注解转移到对应的字段上。
147
+
148
+ ``` java
149
+ @Data
150
+ @SpelValid
151
+ public class TestParamVo {
152
+
153
+ private Boolean switchVoice;
154
+
155
+ @SpelNotNull (condition = " #this.switchVoice == true" )
156
+ private Object voiceContent;
157
+
158
+ @Valid
159
+ @SpelValid /* 在此处添加注解*/
160
+ private TestParamVo2 testParamVo2;
161
+
162
+ }
163
+
164
+ @Data
165
+ public class TestParamVo2 {
166
+
167
+ @SpelNotNull
168
+ private Object object;
169
+
170
+ }
171
+ ```
172
+
173
+ ## 调用静态方法
174
+
175
+ 利用 SpEL 的特性,可以调用静态方法进行校验。
176
+
177
+ 调用静态方法的格式为:` T(全类名).方法名(参数) ` 。
178
+
179
+ 如果你的 IDEA 版本比较新,那么不出意外的话,IDEA 能够识别到表达式,并且会给出提示,也具备引用的功能。
180
+
181
+ ``` java
182
+ @Data
183
+ @SpelValid
184
+ public class SimpleExampleParamVo {
185
+
186
+ /**
187
+ * 枚举值字段校验
188
+ */
189
+ @SpelAssert (assertTrue = " T(cn.sticki.enums.UserStatusEnum).getByCode(#this.userStatus) != null " , message = " 用户状态不合法" )
190
+ private Integer userStatus;
191
+
192
+ // 中文算两个字符,英文算一个字符,要求总长度不超过 10
193
+ // 调用外部静态方法进行校验
194
+ @SpelAssert (assertTrue = " T(cn.sticki.util.StringUtil).getLength(#this.userName) <= 10" , message = " 用户名长度不能超过10" )
195
+ private String userName;
196
+
197
+ }
198
+ ```
199
+
51
200
## 调用 Spring Bean
52
201
53
202
默认情况下,解析器无法识别 SpEL 表达式中的 Spring Bean。
54
203
55
- 如果需要在 SpEL 表达式中调用 Spring Bean,需要在启动类上添加 ` @EnableSpelValidatorBeanRegistrar ` 注解,
204
+ 如果需要在 SpEL 表达式中调用 Spring Bean,需要在任意一个被 Spring 托管的类上添加 ` @EnableSpelValidatorBeanRegistrar ` 注解,
56
205
开启 Spring Bean 支持。
57
206
58
207
``` java
59
-
60
- @EnableSpelValidatorBeanRegistrar
208
+ @EnableSpelValidatorBeanRegistrar /* 添加注解*/
61
209
@SpringBootApplication
62
210
public class Application {
63
211
@@ -67,3 +215,23 @@ public class Application {
67
215
68
216
}
69
217
```
218
+
219
+ 开启 Spring Bean 支持后,即可在 SpEL 表达式中调用 Spring Bean。
220
+
221
+ > 表达式中的 Bean 名称需要以 ` @ ` 开头
222
+
223
+ ``` java
224
+ @Data
225
+ @SpelValid
226
+ public class SimpleExampleParamVo {
227
+
228
+ /**
229
+ * 调用 userService 的 getById 方法,判断用户是否存在
230
+ * 校验失败时,提示信息为:用户不存在
231
+ * 这里只是简单举例,实际开发中不建议这样判断用户是否存在
232
+ */
233
+ @SpelAssert (assertTrue = " @userService.getById(#this.userId) != null" , message = " 用户不存在" )
234
+ private Long userId;
235
+
236
+ }
237
+ ```
0 commit comments