在JSR-303自定义验证器初始化方法中键入check

时间:2013-05-03 20:35:49

标签: bean-validation

我正在尝试创建一个类级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
    }
}

这是明智的做法吗?如果是的话,你建议我用什么方法?如果属性的类型不正确,应该采取什么行动?

1 个答案:

答案 0 :(得分:0)

您无法在initialize()中进行检查,因为您无法在那里访问经过验证的对象。相反,您可以使用反射检查isValid()中已验证对象的字段类型:

if ( !Calendar.class.isAssignableFrom( 
    value.getClass().getField( firstFieldName ).getType() ) ) {
    throw new ValidationException( "Field " + firstFieldName + " is not of type Calendar." );
}