目录
1.5 Bean Validation与Hibernate Validate
1.6 Hibernate Validator与Spring Validation
2.1,初级约束注解的使用(spring-boot-starter-web中已有相关依赖)
1.概念介绍
1.1验证框架对比
- 分层验证框架(每一层对业务数据进行校验:导致许多重复性的代码分散在不同的层中)
- Java Bean验证模型(将验证逻辑通过注解约束在域模型上)
1.2 Bean Validation简介
- Bean Validation为javaBean验证定义了相应的元数据模型和API
1.3 JCP,JSR简介
- JCP(Java Community Process)成立于1998年,是使有兴趣的各方参与定义Java的特征和未来版本的正式过程
- JCP使用JSR(Java规范请求,Java Specificaton Reuqests)作为正式规范文档,描述被提议加入到Java体系中的规范和技术
1.4 JSR303 JSR349 JSR380
- JSR303: Bean Vaildation1.0
- JSR349: Bean Vaildation1.1
- JSR380 Bean Vaildation2.0
1.5 Bean Validation与Hibernate Validate
- Bean Vaildation1.0参考实现:Hibernate Validator 4.3.1.Final
- Bean Vaildation1.1参考实现:Hibernate Validator 5.1.1.Final
- Bean Vaildation2.0参考实现:Hibernate Validator 6.0.1.Final
1.6 Hibernate Validator与Spring Validation
- Spring Validation在Hibernate Validator的基础上,对其进行了二次封装,以满足再Spring环境中更简单,高效的对数据进行验证
2.约束注解
- 空值校验类:@Null;@NotNull,@NotEmpty,@NotBlank
- @NotEmpty不会去掉前后空格;@NotBlank会去掉前后空格再进行校验
- 范围校验类:@Min,@Size(min或者max):对集合的个数进行限定,@Digits(被注释的元素必须是一个数字,其值必须在可接受的范围内),@Future(被注释的元素必须是一个将来的日期),@Negative
- 其他校验类:@Email,@URL,@AssertTrue(被注释的元素必须为true),@Pattern(被注释的元素必须符合指定的正则表达式)等
2.1,初级约束注解的使用(spring-boot-starter-web中已有相关依赖)
加入Validation的相关依赖:javax.validation;validation-api;2.0.1.Final
加入hibernate-validator依赖:org.hiberna; hibernate-validator;6.0.16.Final
//登陆场景(分组时用到) @GroupSequence({ LoginGroup.class, RegisterGroup.class, //没有明确规定属于哪个组的 Default.class }) //只有注解声明为LoginGroup才会验证这个 //级联验证:既可以验证本身属性,又可以验证引用的实例 |
2.2.分组验证
- 在注册场景下email不能为空
@NotNull(message = "邮箱在注册时不能为空",groups = RegisterGroup.class) |
- 在登陆场景下,uerid不能为空
@NotNull(message = "用户id在登陆时不能为空",groups = LoginGroup.class) |
2.3.组序列
- 对对象中的带有groups的属性进行验证,按照@GroupSequence中的顺序进行验证
@GroupSequence({ LoginGroup.class, RegisterGroup.class, //没有明确规定属于哪个组的 Default.class }) |
- Controller方法
- 一个校验类对应一个校验结果(BindingResult),校验结果会被自动填充
@RequestMapping("/addUser")
public String valid(@Validated Person person, BindingResult result) {
if (bindingResult.hasErrors()) {
for (FieldError fieldError : bindingResult.getFieldErrors()) {
System.out.println(fieldError);
}
return "fail";
}
return "success";
}