Hibernate Validator 6.0.7.Final 之二(詳解Validator和ConstraintViolation)
阿新 • • 發佈:2018-11-24
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,也就是不支援級聯校驗。