我正在尝试创建一个类级JSR-303验证定义,该定义检查一个属性是否在另一个属性之前发生。因为这个验证只对Calendar属性有意义,所以我想知道是否可以在initialize方法中测试属性类型。
我的注释定义是:
@Target({TYPE, ANNOTATION_TYPE})
@Retention(RUNTIME)
@Constraint(validatedBy = TemporalSequenceValidator.class)
@Documented
public @interface TemporalSequence {
String message() default "{uk.co.zodiac2000.vcms.constraints.TemporalSequence}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
String first();
String second();
}
和验证器实现:
public class TemporalSequenceValidator implements
ConstraintValidator<TemporalSequence, Object> {
private String firstFieldName;
private String secondFieldName;
@Override
public void initialize(final TemporalSequence constraintAnnotation) {
firstFieldName = constraintAnnotation.first();
secondFieldName = constraintAnnotation.second();
// Is it possible to test type of firstFieldName and
// secondFieldName properties here?
}
@Override
public boolean isValid(final Object value, final ConstraintValidatorContext context) {
// omitted
}
}
这是明智的做法吗?如果是的话,你建议我用什么方法?如果属性的类型不正确,应该采取什么行动?
答案 0 :(得分:0)
您无法在initialize()
中进行检查,因为您无法在那里访问经过验证的对象。相反,您可以使用反射检查isValid()
中已验证对象的字段类型:
if ( !Calendar.class.isAssignableFrom(
value.getClass().getField( firstFieldName ).getType() ) ) {
throw new ValidationException( "Field " + firstFieldName + " is not of type Calendar." );
}