pom.xml
依赖配置
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.10.Final</version>
</dependency>
<!--hibernate-validator 6.0.10.Final 的依赖-->
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.el</artifactId>
<version>3.0.1-b09</version>
</dependency>
Bean Validation 2.0中提供的验证
获取Validator
实例
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
Validator
接口中有三个方法可用于验证,这三个方法都会返回一个Set<ConstraintViolation>
集合,当验证通过的情况下,这个集合是空的,若有约束没有验证通过,则会分别为没有验证通过的约束创建ConstraintViolation
实例,并添加到Set<ConstraintViolation>
集合中
Validator#validate()
对实体进行验证
Validator#validateProperty()
对实体中某个属性进行验证
Validator#validateValue()
对实体中某个属性的值进行验证
例子
@NotNull 当值为null
时验证不通过
@NotEmpty 当值为null
或''
时验证不通过
@NotBlank 当值为null
、''
或' '
时验证不通过
@Length(min = 2, max = 10) 当值的长度小于2或大于10时验证不通过
@Min(value = 10) 当值小于10时验证不通过
分组验证
当验证规则未指定分组时,其属于默认分组。
validator.validate(person)
未指明使用哪个组时使用默认分组中的规则进行验证
由于Bean Validation
支持在一个应用使用多个提供商进行工作,如果超过一个的供应商在类路径下,那么通过buildDefaultValidatorFactory()
创建factory
是无法保证所使用的是哪个供应商。
在这种情况下,我们可以通过Validation#byProvider()
来明确指定使用的是哪个供应商。
ValidatorFactory validatorFactory = Validation.byProvider( HibernateValidator.class )
.configure()
.buildValidatorFactory();
Validator validator = validatorFactory.getValidator();
HibernateValidator.class
每个供应商都会包含这样一个文件
META-INF/services/javax.validation.spi.ValidationProvider
这个文件中指定了ValidationProvider
实现类的全路径名
Hiberante Validator
下这个文件中的内容如下
org.hibernate.validator.HibernateValidator
2018-08-21 联级验证
public class Person {
@NotBlank(message = "名称不能为空", groups = {ValidatorOne.class})
@Length(min = 2, max = 10, groups = {ValidatorOne.class})
private String name;
@Min(value = 10, message = "年龄最小10岁", groups = {ValidatorOne.class})
private int age;
@Valid
private EmailInfo emailInfo;
//...
}
public class EmailInfo {
@Email(message = "邮件格式不正确", groups = {ValidatorOne.class})
private String email;
//...
}
验证名称、年龄的同时也验证邮箱格式
@Test
public void createPerson() {
Person person = new Person();
person.setName("1234560ab");
person.setAge(9);
EmailInfo emailInfo = new EmailInfo();
emailInfo.setEmail("1323");
person.setEmailInfo(emailInfo);
Set<ConstraintViolation<Person>> constraintViolationSet = validator.validate(person, ValidatorOne.class);
assertEquals(2, constraintViolationSet.size());
}