Validator接口在bean的校验中扮演非常重要的角色。本文将详细讲解该接口。
获取该接口的方法
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
validator = factory.getValidator();
该接口中的重要方法
<T> Set<ConstraintViolation<T>> validate(T object, Class<?>... groups);
<T> Set<ConstraintViolation<T>> validateProperty(T object, String propertyName, Class<?>... groups);
<T> Set<ConstraintViolation<T>> validateValue(Class<T> beanType, String propertyName, Object value, Class<?>... groups);
第一个方法可以对整个bean对象做校验(常用)
后面2个方法可以对单个属性进行校验(不常用)
三个方法的返回值都是一个ConstraintViolation类型的集合,如果校验成功,该集合为空;否则,该集合非空,集合中的每一个元素(ConstraintViolation类型)对应一个违反的约束。
ConstraintViolation描述了违反的约束的相关信息,例如:对应的bean、对应的属性、错误消息、错误消息模板等等,具体见例子中的打印结果。
下面通过例子展示Validator接口中的三个重要方法和ConstraintViolation
三个例子都会用到的bean
public class User {
@NotEmpty(message = "名称不能为空")
@Size(min = 4, max = 32, message = "名称长度必须在{min}和{max}之间")
private String name;
@NotEmpty(message = "邮件地址不能为空")
@Email(message = "邮箱格式不正确")
private String email;
@AssertTrue
private boolean isStudent;
public User(String name, String email, boolean isStudent) {
this.name = name;
this.email = email;
this.isStudent = isStudent;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public boolean isStudent() {
return isStudent;
}
public void setStudent(boolean student) {
isStudent = student;
}
}
第一个例子,测试validate方法
@Test
public void validateMethodOneTest() {
User user = new User("su", "tom", false);
validator.validate(user).forEach(System.out::println);
}
// 查看结果
ConstraintViolationImpl{interpolatedMessage='名称长度必须在4和32之间', propertyPath=name, rootBeanClass=class com.qs.mmeng.hibernate.validator.constraints.interfacee.User, messageTemplate='名称长度必须在{min}和{max}之间'}
ConstraintViolationImpl{interpolatedMessage='邮箱格式不正确', propertyPath=email, rootBeanClass=class com.qs.mmeng.hibernate.validator.constraints.interfacee.User, messageTemplate='邮箱格式不正确'}
ConstraintViolationImpl{interpolatedMessage='只能为true', propertyPath=isStudent, rootBeanClass=class com.qs.mmeng.hibernate.validator.constraints.interfacee.User, messageTemplate='{javax.validation.constraints.AssertTrue.message}'}
第二个例子,测试validateProperty方法
@Test
public void validateMethodTwoTest() {
User user = new User("su", "tom", false);
validator.validateProperty(user, "name").forEach(System.out::println);
validator.validateProperty(user, "email").forEach(System.out::println);
validator.validateProperty(user, "isStudent").forEach(System.out::println);
}
// 查看结果
ConstraintViolationImpl{interpolatedMessage='名称长度必须在4和32之间', propertyPath=name, rootBeanClass=class com.qs.mmeng.hibernate.validator.constraints.interfacee.User, messageTemplate='名称长度必须在{min}和{max}之间'}
ConstraintViolationImpl{interpolatedMessage='邮箱格式不正确', propertyPath=email, rootBeanClass=class com.qs.mmeng.hibernate.validator.constraints.interfacee.User, messageTemplate='邮箱格式不正确'}
ConstraintViolationImpl{interpolatedMessage='只能为true', propertyPath=isStudent, rootBeanClass=class com.qs.mmeng.hibernate.validator.constraints.interfacee.User, messageTemplate='{javax.validation.constraints.AssertTrue.message}'}
第三个例子,测试validateValue方法
@Test
public void validateMethodThreeTest() {
validator.validateValue(User.class, "name", "su").forEach(System.out::println);
validator.validateValue(User.class, "email", "invalid-email-address")
.forEach(System.out::println);
validator.validateValue(User.class, "isStudent", false).forEach(System.out::println);
}
// 查看结果
ConstraintViolationImpl{interpolatedMessage='名称长度必须在4和32之间', propertyPath=name, rootBeanClass=class com.qs.mmeng.hibernate.validator.constraints.interfacee.User, messageTemplate='名称长度必须在{min}和{max}之间'}
ConstraintViolationImpl{interpolatedMessage='邮箱格式不正确', propertyPath=email, rootBeanClass=class com.qs.mmeng.hibernate.validator.constraints.interfacee.User, messageTemplate='邮箱格式不正确'}
ConstraintViolationImpl{interpolatedMessage='只能为true', propertyPath=isStudent, rootBeanClass=class com.qs.mmeng.hibernate.validator.constraints.interfacee.User, messageTemplate='{javax.validation.constraints.AssertTrue.message}'}
需要注意的是,validateProperty和validateValue方法不支持@Valid,也就是不支持级联校验。