@@ -85,7 +85,7 @@ public class SimpleExampleParamVo {
85
85
86
86
### 设置开启条件
87
87
88
- ` @SpelValid ` 注解包含一个属性 ` condition ` ,支持 SpEL 表达式。
88
+ ` @SpelValid ` 注解包含一个属性 ` condition ` ,支持 SpEL 表达式,计算结果必须为 ` boolean ` 类型 。
89
89
90
90
当 ** 表达式的算结果为true** 时,表示开启校验,默认情况下是开启的。
91
91
@@ -100,6 +100,46 @@ public class SimpleExampleParamVo {
100
100
这里的 ` condition ` 字段同样支持上下文引用,具体使用方式参考 [ 引用上下文字段] ( #引用上下文字段 ) 。
101
101
102
102
103
+ ## 使用约束注解
104
+
105
+ 目前支持的约束注解有:
106
+
107
+ | 注解 | 说明 | 对标 javax.validation |
108
+ | :---------------:| :---------------:| :-------------------:|
109
+ | ` @SpelAssert ` | 逻辑断言校验 | ` @AssertTrue ` |
110
+ | ` @SpelNotNull ` | 非 null 校验 | ` @NotNull ` |
111
+ | ` @SpelNotEmpty ` | 集合、字符串、数组大小非空校验 | ` @NotEmpty ` |
112
+ | ` @SpelNotBlank ` | 字符串非空串校验 | ` @NotBlank ` |
113
+ | ` @SpelNull ` | 必须为 null 校验 | ` @Null ` |
114
+ | ` @SpelSize ` | 集合、字符串、数组长度校验 | ` @Size ` |
115
+ | ` @SpelMin ` | 即将支持 | ` @Min ` |
116
+ | ` @SpelMax ` | 即将支持 | ` @Max ` |
117
+
118
+ 所有约束注解都包含三个默认的属性:
119
+
120
+ - ` condition ` :约束开启条件,支持 SpEL 表达式,表达式的计算结果必须为 ` boolean ` 类型,当 ** 计算结果为true** 时,才会对带注解的元素进行校验,默认情况下开启。
121
+ - ` message ` :校验失败时的提示信息。
122
+ - ` group ` :分组条件,支持 SpEL 表达式,当分组条件满足时,才会对带注解的元素进行校验。具体使用方式参考 [ 分组校验] ( #分组校验 ) 。
123
+
124
+ 在需要校验的字段上使用 ` @SpelNotNull ` 等约束注解。
125
+
126
+ ``` java
127
+ @Data
128
+ @SpelValid
129
+ public class SimpleExampleParamVo {
130
+
131
+ /**
132
+ * 此处使用了 @SpelNotNull 注解
133
+ * 当参数 condition 的计算结果 true 时,会启用对当前字段的约束,要求为当前字段不能为null
134
+ * 约束校验失败时,提示信息为:语音内容不能为空
135
+ */
136
+ @SpelNotNull (condition = " true" , message = " 语音内容不能为空" )
137
+ private Object audioContent;
138
+
139
+ }
140
+ ```
141
+
142
+
103
143
## 引用上下文字段
104
144
105
145
设计这套组件的初衷,就是为了满足一些需要判断另一个字段的值来决定当前字段是否校验的场景。
@@ -126,52 +166,65 @@ public class SimpleExampleParamVo {
126
166
```
127
167
128
168
129
- ## 使用约束注解
169
+ ## 分组校验
130
170
131
- 目前支持的约束注解有:
171
+ 启动注解 ` @SpelValid ` 上包含一个属性 ` spelGroups ` ,类型为字符串数组,支持 SpEL 表达式。
132
172
133
- | 注解 | 说明 | 对标 javax.validation |
134
- | :---------------:| :---------------:| :-------------------:|
135
- | ` @SpelAssert ` | 逻辑断言校验 | ` @AssertTrue ` |
136
- | ` @SpelNotNull ` | 非 null 校验 | ` @NotNull ` |
137
- | ` @SpelNotEmpty ` | 集合、字符串、数组大小非空校验 | ` @NotEmpty ` |
138
- | ` @SpelNotBlank ` | 字符串非空串校验 | ` @NotBlank ` |
139
- | ` @SpelNull ` | 必须为 null 校验 | ` @Null ` |
140
- | ` @SpelSize ` | 集合、字符串、数组长度校验 | ` @Size ` |
141
- | ` @SpelMin ` | 即将支持 | ` @Min ` |
142
- | ` @SpelMax ` | 即将支持 | ` @Max ` |
173
+ 每一个[ 约束注解] ( #使用约束注解 ) 上也都包含一个属性 ` group ` ,类型为字符串数组,支持 SpEL 表达式。
143
174
144
- 所有约束注解都包含三个默认的属性:
175
+ ::: tip 为什么 @ SpelValid 注解上的 spelGroups 属性不叫 groups?
145
176
146
- - ` message ` :校验失败时的提示信息。
147
- - ` group ` :分组条件,支持 SpEL 表达式,当分组条件满足时,才会对带注解的元素进行校验。
148
- - ` condition ` :约束开启条件,支持 SpEL 表达式,当 ** 表达式为空** 或 ** 计算结果为true** 时,才会对带注解的元素进行校验。
177
+ 因为 ` @SpelValid ` 注解是基于 ` javax.validation.Constraint ` 实现的,而 ` Constraint ` 中已经有一个 ` groups ` 属性了,故命名为 ` spelGroups ` 。
149
178
150
- 在需要校验的字段上使用 ` @SpelNotNull ` 等约束注解。
179
+ 在使用 ` @SpelValid ` 的时候,你可以同时使用 ` groups ` 和 ` spelGroups ` 属性,但是 ` groups ` 属性只能用于 ` javax.validation ` 的分组校验。
180
+ ` @SpelValid ` 和 ` @NotNull ` 、` @NotEmpty ` 等注解是兄弟关系,它的 ` groups ` 属性同样受上层 ` @Valid ` 或 ` @Validated ` 注解的影响。
181
+
182
+ :::
183
+
184
+ 默认情况下,` @SpelValid.spelGroups ` 为空,表示不进行分组校验,此时所有的约束注解都会生效。
185
+
186
+ 当 ` @SpelValid.spelGroups ` 不为空时,表示开启分组校验,此时:
187
+
188
+ - 约束注解中的 ` group ` 属性为空时,该约束注解生效。
189
+ - 约束注解中的 ` group ` 属性不为空时,只有当 ` @SpelValid.spelGroups ` 中的分组信息与此处的分组信息有交集时,才会对带注解的元素进行校验。
190
+
191
+ 这里表达式的计算结果可以是任何类型,但只有两个计算结果满足 ` o.equals(e) ` 时,才被认为是相等的。
192
+
193
+ 使用示例:
151
194
152
195
``` java
153
196
@Data
154
- @SpelValid
155
- public class SimpleExampleParamVo {
197
+ @SpelValid (spelGroups = " #this.type" )
198
+ public class GroupExampleParamVo {
199
+
200
+ @NotNull
201
+ @Pattern (regexp = " ^text|audio$" )
202
+ private String type;
156
203
157
204
/**
158
- * 此处使用了 @SpelNotNull 注解
159
- * 当参数 condition 的计算结果 true 时,会启用对当前字段的约束,要求为当前字段不能为null
160
- * 约束校验失败时,提示信息为:语音内容不能为空
205
+ * 当 type 字段的值为 text 时,才会对此字段进行校验
161
206
*/
162
- @SpelNotNull (condition = " true" , message = " 语音内容不能为空" )
207
+ @SpelNotNull (group = " 'text'" )
208
+ private Object textContent;
209
+
210
+ /**
211
+ * 当 type 字段的值为 audio 时,才会对此字段进行校验
212
+ */
213
+ @SpelNotNull (group = " 'audio'" )
163
214
private Object audioContent;
164
215
216
+ /**
217
+ * 未指定分组,默认被校验
218
+ */
219
+ @SpelNotNull
220
+ private Integer other;
221
+
165
222
}
166
223
```
167
224
168
- ## 分组校验
169
-
170
- 待补充
171
-
172
225
## 嵌套校验
173
226
174
- 本组件支持嵌套校验,只需要在需要校验的字段上添加 ` @Valid ` ,以及在另一个类上添加 ` @SpelValid ` 注解。
227
+ 本组件支持嵌套校验,在需要校验的字段上添加 ` @Valid ` ,以及在另一个类上添加 ` @SpelValid ` 注解。
175
228
176
229
``` java
177
230
@Data
0 commit comments