本文将全面的介绍如何使用 validator 进行数据校验
本文源码:https://gitee.com/yintianwen7/taven-springboot-learning/tree/master/springboot-validate
准备工作
我们只需要引入 spring-boot-starter-web
包即可使用
常用注解
注解 | 释义 |
---|---|
@Valid | 被注释的元素是一个对象,需要检查此对象的所有字段值 |
@Null | 被注释的元素必须为 null |
@NotNull | 被注释的元素必须不为 null |
@NotEmpty | 被注释的字符串的必须非空, 即不为null, “” |
@NotBlank | 被注释的字符串的必须非空, 即不为null, “”, “ “ |
@AssertTrue | 被注释的元素必须为 true |
@AssertFalse | 被注释的元素必须为 false |
@Min(value) | 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 |
@Max(value) | 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 |
@DecimalMin(value) | 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 |
@DecimalMax(value) | 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 |
@Size(max, min) | 被注释的元素的大小必须在指定的范围内 |
@Digits (integer, fraction) | 被注释的元素必须是一个数字,其值必须在可接受的范围内 |
@Past | 被注释的元素必须是一个过去的日期 |
@Future | 被注释的元素必须是一个将来的日期 |
@Pattern(value) | 被注释的元素必须符合指定的正则表达式 |
被注释的元素必须是电子邮箱地址 | |
@Length(min=, max=) | 被注释的字符串的大小必须在指定的范围内 |
@Range(min=, max=) | 被注释的元素必须在合适的范围 |
简单的实体校验
1 | public class CardDTO { |
1 | @RestController |
- 实体属性上添加校验注解
- controller 方法 参数前 使用
@Valid
即可
复杂的实体校验
嵌套实体校验
1 | public class UserDTO { |
- controller 写法 同上,只是在 UserDTO cardList 属性上标记@Valid 注解 即可。
List 校验
我们需要像 嵌套校验 时一样,对
List<CardDTO>
做一层封装1
2
3
4
5
6
7
8
9
10
11
12
13
14
15public class ValidList<E> implements List<E> {
@Valid
private List<E> list = new ArrayList<>();
public List<E> getList() {
return list;
}
public void setList(List<E> list) {
this.list = list;
}
// 省略了 实现方法
}重写实现方法完全使用 this.list.xxx()
Gitee:
spring 会将数据封装到我们定义的 list 属性中,又将属性声明了 @Valid 使得 hibernate validator 可以为我们做校验!
使用 @Validated 分组校验
1 | public interface Insert { |
定义两个接口
1
2
3
4
5
6
7
8
9
10
11
12
13public class GroupCardDTO {
@NotBlank(groups = {Update.class})
private String id;
@NotBlank(groups = {Insert.class})
private String cardNum;
@NotNull(groups = {Insert.class, Update.class})
private Integer cardType;
//省略 get set
}实体标记的注解中添加 group 属性
1
2
3
4@PostMapping("insert_card")
public Object insert_card(@RequestBody @Validated(Insert.class) GroupCardDTO card){
return card;
}使用 @Validated(xxx.class) 标记参数,完成分组校验!
自定义注解校验
当 validator 提供的注解无法满足我们的业务需求,可以通过自定义的方式来实现校验。
需求:校验某字符串必须为大写或者小写
1 | public enum CaseMode { |
- 定义一个枚举类
1 | import javax.validation.Constraint; |
- 定义注解
@Constraint
指定我们的校验逻辑实现类
1 | import javax.validation.ConstraintValidator; |
initialize()
初始化时执行,可以用来获取注解中的属性isValid()
实现我们的校验逻辑
备注
- 我们自定义的注解依然支持 @Validated group 分组
手动使用 validator 校验
1 | import org.hibernate.validator.internal.engine.path.PathImpl; |
本节源码
https://gitee.com/yintianwen7/taven-springboot-learning/tree/master/springboot-validate