Hibernate Validator 6.0.7.Final 之一(宣告Bean約束之class級別的約束)
阿新 • • 發佈:2018-11-24
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級別的來校驗就行了。