1
- < h1 align = " center " > SpEL Validator</ h1 >
1
+ # SpEL Validator
2
2
3
- <div align =" center " >
3
+ [ ![ Maven Central] ( https://img.shields.io/maven-central/v/cn.sticki/spel-validator.svg )] ( https://central.sonatype.com/search?q=g:cn.sticki%20a:spel-validator )
4
+ [ ![ license] ( https://img.shields.io/github/license/stick-i/spel-validator )] ( https://github.com/stick-i/spel-validator/blob/main/LICENSE )
4
5
5
- 「SpEL Validator」是基于 SpEL 的参数校验包,也是 javax.validation 的扩展增强包 ,用于简化参数校验。
6
+ 一个强大的 Java 参数校验包,基于 SpEL 实现,扩展自 javax.validation 包 ,用于简化参数校验,几乎支持所有场景下的参数校验 。
6
7
7
- </ div >
8
+ ---
8
9
9
- ## 📚 目录
10
+ ## 文档
10
11
11
- [ 简介] ( #-简介 ) | [ 它解决了什么问题] ( #-它解决了什么问题 ) |
12
- [ 快速开始] ( #-快速开始 ) | [ 使用指南] ( #-使用指南 ) | [ 示例项目] ( #-示例项目 ) | [ 常见问题] ( #-常见问题 ) |
13
- [ 更新日志] ( #-更新日志 ) | [ 贡献指南] ( #-贡献指南 ) | [ 捐赠支持] ( #-捐赠支持 ) | [ 联系作者] ( #-联系作者 )
12
+ 更详细的文档:https://spel-validator.sticki.cn/
14
13
15
- ## 📝 简介
16
-
17
- ### 特点
14
+ ## 特点
18
15
16
+ - 简单易用,使用方式几乎与 javax.validation 一致,学习成本低,上手快。
19
17
- 强大的参数校验功能,几乎支持所有场景下的参数校验。
20
18
- 扩展自 javax.validation 包,只新增不修改,无缝集成到项目中。
21
19
- 基于 SpEL(Spring Expression Language) 表达式,支持复杂的校验逻辑。
22
20
- 支持调用 Spring Bean,可在表达式中使用注入过的 Spring Bean。
23
21
- 校验时基于整个对象,支持对象内字段间的校验逻辑。
24
22
- 支持自定义校验注解,可根据业务需求自定义校验逻辑。
25
23
- 无需额外的异常处理,校验失败时会上报到 javax.validation 的异常体系中。
26
- - 简单易用,使用方式几乎与 javax.validation 一致,学习成本低,上手快。
27
-
28
- ### 环境
29
24
30
- 目前仅测试了 JDK8 环境,理论上来说 JDK8+ 应该都是支持的。
25
+ ## 支持的环境
31
26
32
- ### 交流群
27
+ JDK8+
33
28
34
- < img src = " ./document/image/wechat-qrcode.jpg " alt = " 交流群二维码.jpg " style = " width : 25 % ; height : auto ; " />
29
+ ## 交流群
35
30
36
- > 如果二维码过期, 请添加微信号 ` sticki6 ` ,备注 ` SpEL ` ,我拉你入群。
31
+ 请添加微信号 ` sticki6 ` ,备注 ` SpEL ` ,我拉你入群。
37
32
38
- ## 💡 它解决了什么问题?
33
+ ## 它解决了什么问题?
39
34
40
35
- 枚举值字段校验:
41
36
``` java
84
79
<artifactId >spel-validator</artifactId >
85
80
<version >Latest Version</version >
86
81
</dependency >
87
-
88
- <dependency >
89
- <groupId >org.hibernate.validator</groupId >
90
- <artifactId >hibernate-validator</artifactId >
91
- <version >${hibernate-validator.version}</version >
92
- </dependency >
93
-
94
- <dependency >
95
- <groupId >org.springframework.boot</groupId >
96
- <artifactId >spring-boot-starter-web</artifactId >
97
- <version >${spring-boot-starter-web.version}</version >
98
- </dependency >
99
82
```
100
83
101
84
- 在接口参数上使用 ` @Valid ` 或 ` @Validated ` 注解
120
103
121
104
``` java
122
105
@Data
123
- @SpelValid
106
+ @SpelValid // 添加启动注解
124
107
public class SimpleExampleParamVo {
125
108
126
109
@NotNull
127
110
private Boolean switchAudio;
128
111
129
112
/**
130
- * 当 switchAudio 为 true 时,校验 audioContent,audioContent 不能为null
113
+ * 此处开启了注解校验
114
+ * 当 switchAudio 字段为 true 时,校验 audioContent,audioContent 不能为null
131
115
*/
132
116
@SpelNotNull (condition = " #this.switchAudio == true" , message = " 语音内容不能为空" )
133
117
private Object audioContent;
134
-
118
+
135
119
}
136
120
```
137
121
138
- - 添加异常处理器 ,处理校验异常
122
+ - 添加全局异常处理器 ,处理校验异常
139
123
140
124
``` java
141
125
@RestControllerAdvice
220
204
```
221
205
</details>
222
206
223
- ## 📖 使用指南
224
-
225
- > 注意:本组件的目的不是代替 `javax.validation` 的校验注解,而是作为一个扩展,方便某些场景下的参数校验。
226
- > 能够使用 `javax.validation` 的场景就不要使用 `spel-validator` ,因为 `spel-validator` 会有一定的性能损耗。
227
-
228
- ### 开启约束校验
229
-
230
- 需要满足以下两个条件,才会对带注解的元素进行校验:
231
-
232
- 1 . 在接口参数上使用 `@Valid` 或 `@Validated` 注解
233
- 2 . 在实体类上使用 `@SpelValid` 注解
234
-
235
- 如果只满足第一个条件,那么只会对带 `@NotNull`、`@NotEmpty`、`@NotBlank` 等注解的元素进行校验。
236
-
237
- 如果只满足第二个条件,那么不会对任何元素进行校验。
238
-
239
- 这是因为 `@SpelValid` 注解是基于 `javax.validation.Constraint` 实现的,只有在 `@Valid` 或 `@Validated` 注解的支持下才会生效。
240
- 而 `spel-validator` 提供的约束注解是基于 `@SpelValid` 进行扫描校验的,只有在 `@SpelValid` 注解生效的情况下才会执行约束校验。
241
-
242
- ### 使用约束注解
243
-
244
- 目前支持的约束注解有:
245
-
246
- | 注解 | 说明 | 对标 javax.validation |
247
- |:---------------:|:---------------:|:-------------------:|
248
- | `@SpelAssert` | 逻辑断言校验 | 无 |
249
- | `@SpelNotNull` | 非 null 校验 | `@NotNull` |
250
- | `@SpelNotEmpty` | 集合、字符串、数组大小非空校验 | `@NotEmpty` |
251
- | `@SpelNotBlank` | 字符串非空串校验 | `@NotBlank` |
252
- | `@SpelNull` | 必须为 null 校验 | `@Null` |
253
- | `@SpelSize` | 集合、字符串、数组长度校验 | `@Size` |
254
-
255
- 每个约束注解都包含三个默认的属性:
256
-
257
- - `message`:校验失败时的提示信息。
258
- - `group`:分组条件,支持 SpEL 表达式,当分组条件满足时,才会对带注解的元素进行校验。
259
- - `condition`:约束开启条件,支持 SpEL 表达式,当 表达式为空 或 计算结果为true 时,才会对带注解的元素进行校验。
260
-
261
- ### 调用 Spring Bean
262
-
263
- 默认情况下,解析器无法识别 SpEL 表达式中的 Spring Bean。
264
-
265
- 如果需要在 SpEL 表达式中调用 Spring Bean,需要在启动类上添加 `@EnableSpelValidatorBeanRegistrar` 注解,
266
- 开启 Spring Bean 支持。
267
-
268
- ```java
269
-
270
- @EnableSpelValidatorBeanRegistrar
271
- @SpringBootApplication
272
- public class Application {
273
-
274
- public static void main(String[] args) {
275
- SpringApplication.run(Application.class, args);
276
- }
277
-
278
- }
279
- ```
280
-
281
- ### 自定义约束注解
282
-
283
- 参考 ` cn.sticki.validator.spel.SpelConstraint ` 类,实现自定义约束注解。
284
-
285
- 如果你使用过 ` javax.validation ` 的自定义约束注解,那么你会发现 ` SpEL Validator ` 的自定义约束注解几乎与 ` javax.validation `
286
- 一致。
287
-
288
207
## 📦 示例项目
289
208
290
209
- [spel-validator-example](https://github.com/stick-i/spel-validator-example)
291
210
292
- ## ❓ 常见问题
293
-
294
- ### 关于性能
295
-
296
- 代码里使用了较多的反射,会有一定的性能损耗,但我也加了一些缓存来减少损耗。
297
-
298
- 我进行了简单的测试,在示例项目中,我对接口进行了多次随机调用,除了刚开始的前几次请求耗时会达到 10ms 以上,
299
- 后续请求耗时会稳定在 1ms 左右。
300
-
301
- 您可以打开 debug 日志,过滤 ` Spel validate cost time ` 语句,查看校验耗时,会得到类似如下的日志内容:
302
-
303
- ![ 执行耗时日志截图.png] ( document/image/performance-test.png )
304
-
305
- 其中每条记录表示一次接口调用的完整校验耗时。
306
-
307
- ## 📅 更新日志
308
-
309
- https://github.com/stick-i/spel-validator/releases
310
-
311
211
## 🤝 贡献指南
312
212
313
213
非常欢迎您来参与项目贡献,但希望您可以先在 issue 中提出您的想法,我们可以一起讨论,然后再进行代码编写。
@@ -320,14 +220,18 @@ https://github.com/stick-i/spel-validator/releases
320
220
- `docs`:文档分支,修改文档的内容将提交到这里。
321
221
- `gh-pages`:GitHub Pages 分支,用于发布在线文档。
322
222
323
- ## 💰 捐赠支持
223
+ ## License
324
224
325
- | 微信赞赏 | 支付宝赞赏 |
326
- | ------------------------------------------------------| --------------------------------------------------|
327
- | ![ 微信] ( ./document/image/wechat-appreciation-code.jpg ) | ![ 支付宝] ( ./document/image/alipay-receipt-code.jpg ) |
225
+ [Apache-2.0 ](https://github.com/stick-i/spel-validator/blob/main/LICENSE)
328
226
329
227
## 📧 联系作者
330
228
331
229
332
230
- 微信: sticki6
333
231
- 公众号: 程序员阿杆
232
+
233
+ ## 💰 捐赠支持
234
+
235
+ | 微信赞赏 | 支付宝赞赏 |
236
+ |------------------------------------------------------|--------------------------------------------------|
237
+ |  |  |
0 commit comments