1. 程式人生 > >Hibernate Validator 6.0.7.Final 之一(宣告Bean約束之級聯約束)

Hibernate Validator 6.0.7.Final 之一(宣告Bean約束之級聯約束)

前幾篇文章講的校驗都是針對簡單屬性,那麼,如果一個bean的屬性是一個複雜物件呢,我們該怎麼校驗,其實也簡單,只需要在這個屬性上使用@Valid註解就可以了。

  • Person的定義
public class Person {

    @NotNull(message = "不能沒有名字")
    @NotBlank(message = "名字不能為空字串")
    private String name;

    public String getName() {
        return name;
    }

    public void setName
(String name) { this.name = name; } }
  • Car的定義
public class Car {

    @NotNull
    @Valid
    private Person driver;

    public Person getDriver() {
        return driver;
    }

    public void setDriver(Person driver) {
        this.driver = driver;
    }

}

注意:我們在Car的driver屬性上使用了@Valid註解,這樣才能進行級聯校驗

  • 測試
    @Test
    public void cascadeTest() {
        Person driver = new Person();

        Car car = new Car();
        car.setDriver(driver);

        Set<ConstraintViolation<Car>> constraintViolations = validator.validate(car);
        logger.info("違反的約束的個數:{}", constraintViolations.size
()); for (ConstraintViolation<Car> constraintViolation : constraintViolations) { logger.info("違反的約束:{}", constraintViolation.getMessage()); } logger.info("-----------"); car.setDriver(null); constraintViolations = validator.validate(car); logger.info("違反的約束的個數:{}", constraintViolations.size()); for (ConstraintViolation<Car> constraintViolation : constraintViolations) { logger.info("違反的約束:{}", constraintViolation.getMessage()); } }
  • 檢視
    這裡寫圖片描述
    需要注意的是,第一次測試中,我們的driver屬性不為空,同時使用了@Valid註解,所以進行了級聯校驗;第二次測試,我們將driver屬性設定為空,此時,不會進行級聯校驗(既然都是空了,還怎麼校驗)。