本文目录
1 Java Bean Validation
Java Bean Validation (JSR 303)是一个校验框架,属于Java EE 6规范中的一部分。
定义了一些约束接口,可通过注解方式使用这些约束条件。
约束接口 | 详细信息 |
@Null | 元素必须为 null |
@NotNull | 元素必须不为 null |
@AssertTrue | 元素必须为 true |
@AssertFalse | 元素必须为 false |
@Min(value) | 元素必须是一个数字,其值必须大于等于指定的最小值 |
@Max(value) | 元素必须是一个数字,其值必须小于等于指定的最大值 |
@DecimalMin(value) | 元素必须是一个数字,其值必须大于等于指定的最小值 |
@DecimalMax(value) | 元素必须是一个数字,其值必须小于等于指定的最大值 |
@Size(max, min) | 元素的大小必须在指定的范围内 |
@Digits(integer, fraction) | 元素必须是一个数字,其值必须在可接受的范围内 |
@Past | 元素必须是一个过去的日期 |
@Future | 元素必须是一个将来的日期 |
@Pattern(value) | 元素必须符合指定的正则表达式 |
@Valid | 元素中的每一项都进行检查 |
2 Hibernate Validator
Hibernate Validator实现了Java BeanValidation中所有的约束接口。
同时,额外提供了部分约束接口及实现。
Constraint | 详细信息 |
@NotEmpty | 字符串的必须非空,且不能是空字符串 |
@NotBlank | 字符串的必须非空,且不能是空白字符串,即trim()后长度大于0 |
@Length | 字符串的长度必须在指定的范围内 |
@Range | 元素必须在合适的范围内 |
| 元素必须符合电子邮箱地址格式 |
@URL | 元素必须符合URL格式 |
3 相关Jar包
validation-api.jar
提供Java Bean Validation中的约束接口(没有具体实现)。
hibernate-validator.jar
提供对Java Bean Validation的具体实现,并提供额外的约束接口及实现。
使用了表达式语言(Expression Language),依赖于javax.el:javax.el-api.jar和org.glassfish.web:javax-el.jar两个包。
注意:
在Spring Boot项目中,tomcat-embed-el集成了el和el实现类,因此,不需要pom.xml添加依赖的el相关包。
但是,要注意由于<dependency>顺序导致的依赖包冲突失效问题。
javax.el : javax.el-api.jar
提供表达式语言抽象类(没有具体实现)。
org.glassfish.web : javax-el.jar
提供了表达式语言的具体实现。(也可以使用其它实现了javax.el的包)
4 Java校验
// 获取校验器
Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
// 校验对象
Set<ConstraintViolation<Object>> failSet = validator.validate(obj);
// 校验失败数量
int failCount = failSet.size();
// 遍历处理错误信息
for (ConstraintViolation<Object> cv : set) {
// 处理逻辑
}
5 Spring MVC校验
从Spring 3开始,Spring MVC就能够自动验证@Controller入参。
仅需添加Hibernate Validator包(或其它实现JSR303的包),即可通过<mvc:annotation-driven>检测到。
从而,让Validator支持所有的Controller。
@RestController
public class DemoController {
// 若校验不通过,直接抛出异常,不会执行validTest1方法。
@GetMapping("/valid1")
public String validTest1(@Valid User user) {
return "Valid Test.";
}
// 若校验不通过,将校验失败信息保存至result对象中,继续执行validTest2方法。
@GetMapping("/valid2")
public String validTest2(@Valid User user, BindingResult result) {
return "Valid Test with BindingResult.";
}
}