2013-06-05 232 views
3

假設有這樣一個bean:Bean驗證驗證一個驗證是否有效?

public class Car { 
    @ConstraintA  
    @ConstraintB 
    private String type; 

    //getters and setters 
} 

通常情況下,要求兩個約束需要才能被接受現場纔有效。 Bean Validation中是否有可能以如果ConstraintA有效的方式進行配置,那麼只有在檢查ConstraintB並且只有在兩者均使該域失效時纔可以進行配置。

編輯:更多解釋... 假設ValidatorA用於ConstraintA,ValidatorB用於ConstraintB。在典型配置中,Bean驗證的工作原理是這樣的:

if (validatorA.isValid(car.type) && validatorB.isValid(car.type)) { 
    validate(car); 
} 

我想問問有沒有在做這樣的事情它配置的一種方式:

if (validatorA.isValid(car.type) || validatorB.isValid(car.type)) { 
    validate(car); 
} 

回答

4

我不知道我得到你問什麼,但如果你打算在@Contraint1沒有失敗,只有執行@Contraint2驗證,可以使用JSR-303 groups做這樣的事情:

@GroupSequence(value={Car.class, Contraint1Group.class,Contraint2Group.class}) 
public class Car { 

    @ContraintA(groups=Contraint1Group.class) 
    @ContraintB(groups=Contraint2Group.class) 
    private String type; 

} 

您還需要申報的標誌性接口指定組:

public interface Contraint1Group extends Default { } 

public interface Constraint2Group {} 

其中第一延伸javax.validation.groups.Default是默認的,當與約束註解指定組。


編輯問題更新後:可以,但前提是使用Hibernate的驗證,這雖然是JSR-303的參考實現,提供了@ConstraintComposition(OR) extension,同時創造新的定製組成的驗證規則:

@ConstraintComposition(OR) 
@Constraint1 
@Constraint2 
@ReportAsSingleViolation 
@Target({ METHOD, FIELD }) 
@Retention(RUNTIME) 
@Constraint(validatedBy = { }) 
public @interface Constraint1ORConstraint2 { 
    String message() default "{Constraint1ORConstraint2.message}"; 
    Class<?>[] groups() default { }; 
    Class<? extends Payload>[] payload() default { }; 
} 

其中@ReportAsSingleViolation表示每次執行只會報告一次違規(您可以全部刪除此註釋)。由於@Constraint1ORConstraint2註釋本身不需要額外驗證,因此請勿在@Constraint元註釋中聲明驗證程序。