1. 程式人生 > >Hibernate Validator 6.0.7.Final 之二(詳解Validator和ConstraintViolation)

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

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,也就是不支援級聯校驗。