一、验证框架
验证框架对用来对数据进行校验的一个框架,本篇将演示如何通过使用已有的约束注解及如何自定义约束注解进行数据校验,并了解JSR规范、验证框架的原理
验证模型
第一种是分层验证即在MVC架构中的每一层进行校验,这样就会造成大量的重复代码
第二种是Java Bean验证即只将验证逻辑通过注解约束在域模型上,将验证逻辑从业务代码中分离出来
Bean Validation
Bean Validation是为了Java Bean验证定义的响应的元数据模型和API
JCP与JSR
JCP(Java Community Process)成立于1998年,是使有兴趣的各方参与定义Java Bean的特征和未来版的正式过程
JCP使用JSR(Java规范请求,Java Specification Requests)作为正式规范文档,描述被提议加入到Java体系中的规范和技术
- JSR303即Bean Validation 1.0
- JSR349即Bean Validation 1.1
- JSR380即Bean Validation 2.0
Bean Validation 与 Hibernate Validator
- Bean Validation 1.0参考实现:Hibernate Validator 4.3.1 Final
- Bean Validation 1.1参考实现:Hibernate Validator 5.1.1 Final
- Bean Validation 2.0参考实现:Hibernate Validator 6.0.1 Final
plus:Hibernate Validator与ORM框架Hibernate没有任何关系
Hibernate Validator VS Spring Validation
Spring Validation在Hibernate Validator的基础上对其进行了二次封装,实现在Spring环境中更简单、更高效的对数据进行验证
常用约束注解
- 空值校验类:@Null、@NotNull、@NotEmpty、@NotBlank
- 范围校验类:@Min、@Size、@Digits、@Future、@Negative
- 其他校验类:@Email、@URL、@AssertTure、@Pattern plus:@NotEmpty会将左右空字符去除后判断,@NotBlank直接判断
二、工程搭建
新建maven项目,选择maven-archetype-quickstart
引入validation相关依赖
<dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>2.0.1.Final</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>6.0.16.Final</version> </dependency> <dependency> <groupId>javax.el</groupId> <artifactId>javax.el-api</artifactId> <version>3.0.0</version> </dependency> <dependency> <groupId>org.glassfish.web</groupId> <artifactId>javax.el</artifactId> <version>2.2.6</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.18</version> <scope>provided</scope> </dependency> 复制代码
新增entity包,并在entity包下新增User实体类,先不定义任何属性,待到需要验证时再定义属性
@Data public class User { private Integer userId; private String userName; private String passWord; private String email; private String phone; private Integer age; private Date birthday; private List<User> friends; } 复制代码
三、初级约束注解的使用
- 空值验证
- 范围验证
- 其他验证
@NotNull
在User实体类的userId属性上增加注解@NotNull(message="用户ID不能为空"),message为验证信息,当不符合条件时会返回message信息
在test包下生成User测试类UserTest
public class UserTest { // 验证器对象 private Validator validator; // 待验证对象 private User user; private Set<ConstraintViolation<User>> set; // 初始化 @Before public void init(){ // 初始化验证器 validator = Validation.buildDefaultValidatorFactory().getValidator(); user = new User(); } @Test public void testUser(){ set = validator.validate(User); } // 打印结果 @After public void after(){ set.forEach(item -> { // 输出错误信息 System.out.println(item.getMessage()); }); } } 复制代码
首先在init方法中new一个User对象,先不对属性进行赋值,执行测试
validator调用validate方法会返回一个set集合,如果验证失败则会将错误信息放在set集合中, User对象的ID为空,验证失败,集合中保存了message信息,所以控制台输出@NotNull注解中指定的错误信息,@NotNull注解生效
在init方法中调用User的setter方法给id属性进行赋值,再次执行测试
验证成功,验证结果集为空,所以输出内容为空
@NotEmpty、@NotBlank
@NotEmpty和@NotBlank都可以验证内容是否为空。
在User实体类的userName和password属性上分别增加 @NotEmpty(message = "用户的userName不能为空") 和@NotBlank(message = "用户的password不能为空")两个注解,执行测试testUser测试方法
验证失败,控制台输出注解中定义的message的信息
在init方法中新增对User对象的userName属性调用setter方法进行赋值,再次执行测试
init方法中设置userName和password都为" ",再次执行测试
@NotBlank会自动去掉字符串中的空格后再进行验证
@Length
可用于验证字符串的长度,有min和max及message三个属性
在用户的password属性上增加@Length注解,设置min、max、message三个属性的value
@Length(min = 6, max = 20, message = "用户密码不能少于6位,不能多于20位") 复制代码
在init方法中调用setter方法设置用户密码少于6位,执行测试
在init方法中调用setter方法设置用户密码多于20位,再次执行测试
@Email只能验证邮箱格式是否正确,@NotNull用于验证是否为空
在User实体类的email属性上增加@Email注解
@Email(message = "用户邮箱格式不正确") 复制代码
在init方法中调用setter方法对Email进行赋值,执行测试
user.setEmail("213243@stark.com"); 复制代码
@Min、@Max
@Min和@Max可用于整形数据的范围验证
在User实体类的age属性上增加@Min和@Max两个注解,设定用户的年龄范围
@Min(value = 18, message = "用户年龄不能小于18岁") @Max(value = 100, message = "用户年龄不能大于100岁") 复制代码
在init方法中调用setter方法设置用户年龄
user.setAge(9); 复制代码
执行测试
修改设置的年龄大小
user.setAge(119); 复制代码
@Past
@Past可以对时间完成校验,校验给出的时间是否是过去的时间
在User实体类的birtdday属性上增加@Past注解
@Past(message = "用户生日不能为未来的时间点") 复制代码
在init方法设置用户的birthday属性
Calendar calendar = Calendar.getInstance(); calendar.set(2023,1,1); user.setBirthday(calendar.getTime()); 复制代码
执行测试
@Size
@Size可以对集合中的元素的个数进行校验,同样有min、max、message三个属性
在User实体类的friends属性上增加@Size注解
@Size(min = 1, message = "用户好友不能少于1个") 复制代码
在init方法中设置firends属性
List<User> friends = new ArrayList<>(); user.setFriends(friends); 复制代码
执行测试
以上就是初级约束注解的使用方式