2016-03-17 26 views
2

我有一個問題,將javax註釋與自定義ConstraintValidators結合起來。來自javax.validation.constraints的註解與自定義ConstraintValidator的組合

我有一個類Person的例子,其中的名稱和年齡是必需的。

@PersonConstraint 
public class Person { 

    @NotNull 
    private String name; 
    @NotNull 
    private Integer age;  
    ... 
} 

而且我有一個額外的約束:

@Constraint(validatedBy = PersonValidator.class) 
@Target(TYPE) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface PersonConstraint{ 

    String message() default "..."; 
    Class<?>[] groups() default {}; 
    Class<? extends Payload>[] payload() default {}; 
} 

對於自定義驗證:

public class PersonValidator implements ConstraintValidator<PersonConstraint, Person> { 
    ... 
    @Override 
    public boolean isValid(Person value, ConstraintValidatorContext context) { 
     if(value.getAge() < 18) 
      return false; 
     ... 
    } 
} 

當一個人現在對象驗證,年齡爲空時,我得到了一個空指針PersonValidator中的異常。我想知道,這是由javax Annoation @NotNull檢查的東西。 是否有解決方案將註釋與自定義驗證器相結合,還是我必須自己檢查驗證器中的空值?

(該代碼只是一個例子 - 但是這是一個普遍的問題)

+0

你的意思是說,你需要控制的驗證正確的順序? –

+0

是的,那是我的本意。 – MarryS

+0

它不是正確的答案,但爲了使事情變得簡單,你可以在'PersonValidator'類本身驗證這裏的空檢查嗎? –

回答

2

除非你與組和組序列工作,沒有保證順序的限制將要進行評價。你不能依靠已經發生的自定義約束。即使如此,你仍然會得到一個NullPointerException。 Bean Validation默認情況下不會在第一次違反約束後停止,但會收集所有需要驗證的違規(因此返回一組ConstraintViolation s。因此實際上可能已經有一個約束衝突age,但在您的自定義ConstraintValidator中,您會仍然是訪問null值。你不能避開這個階段做一個null檢查。