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

Hibernate Validator 6.0.7.Final 之一(宣告Bean約束之class級別的約束)

field級別的約束property級別的約束都是針對單個屬性的,而類級別的屬性則是針對整個物件的,這在一個物件的多個屬性之間具有相關性的情況下是非常有用的。

  • 對於下面這個類,我們應該確保乘客的數量不能多於座位的數量,也就是屬性seatCount和passengers之間具有相關性,此時,class級別的約束就有了用武之地
@ValidPassengerCount
public class Car {

    private int seatCount;

    private List<Person> passengers;

    public
int getSeatCount() { return seatCount; } public void setSeatCount(int seatCount) { this.seatCount = seatCount; } public List<Person> getPassengers() { return passengers; } public void setPassengers(List<Person> passengers) { this
.passengers = passengers; } }
  • 我們注意到了,在Car類上,我們使用了class級別的約束@ValidPassengerCount,這個約束是用來校驗乘客數量不能超過座位數量的,具體實現如下:
@Target({TYPE, ANNOTATION_TYPE})
@Retention(RUNTIME)
@Constraint(validatedBy = {ValidPassengerCountValidator.class})
@Documented
public @interface ValidPassengerCount {

    String message() default
"乘客數量不能超過座位數量"; Class<?>
[] groups() default {}; Class<? extends Payload>[] payload() default {}; }
public class ValidPassengerCountValidator implements ConstraintValidator<ValidPassengerCount, Car> {

    @Override
    public void initialize(ValidPassengerCount constraintAnnotation) {

    }

    @Override
    public boolean isValid(Car car, ConstraintValidatorContext context) {
        if (car == null) {
            return true;
        }
        return car.getPassengers().size() <= car.getSeatCount();
    }
}

怎樣實現自定義的校驗不是本文要講的,通過本文,我們只要瞭解到如果一個物件的多個屬性之間有約束關係,那麼我們可以使用class級別的來校驗就行了。