Hibernate Validator 6.0.7.Final 之二(详解Validator和ConstraintViolation)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_17586821/article/details/80049003

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);
  1. 第一个方法可以对整个bean对象做校验(常用)
  2. 后面2个方法可以对单个属性进行校验(不常用)
  3. 三个方法的返回值都是一个ConstraintViolation类型的集合,如果校验成功,该集合为空;否则,该集合非空,集合中的每一个元素(ConstraintViolation类型)对应一个违反的约束。
  4. 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,也就是不支持级联校验。

猜你喜欢

转载自blog.csdn.net/qq_17586821/article/details/80049003