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级别的来校验就行了。