約束也可以應用在類級別上,來校驗整個對象的狀態。類級別的約束,被定義和屬性約束相同的方式,下面的例子展示@ValidPassengerCount的約束註解和校驗器,你在之前的文章中見到過的。
@Target({ TYPE, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy = { ValidPassengerCountValidator.class })
@Documented
public @interface ValidPassengerCount {
String message() default "{org.hibernate.validator.referenceguide.chapter06.classlevel." +
"ValidPassengerCount.message}";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
}
package org.hibernate.validator.referenceguide.chapter06.classlevel;
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();
}
}
正如例子中證明的那樣,你需要在@Target註解中使用使用元素類型TYPE。這將使你的約束被放在type定義中。這個在例子中約束的校驗器,將會收到一個Car,在isValid()方法中,可以通過比較對象的狀態,來決定給定的對象是否是有效的。