2013-05-03 21 views
0

我試圖創建一個類級別的JSR-303驗證定義,檢查其中一個屬性發生在另一個時間之前。因爲這個驗證只對日曆屬性有意義,所以我想知道是否可以在初始化方法中測試屬性類型。類型簽入JSR-303自定義驗證器初始化方法

我的註釋的定義是:

@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

您無法在initialize()中進行檢查,因爲您無法訪問該處的驗證對象。相反,您可以使用反射來檢查isValid()中已驗證對象的字段類型:

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

感謝Gunnar。你的回答幫助我指出了正確的方向。 – 2013-05-04 12:31:10

相關問題