假设有一个像这样的bean:
public class Car {
@ConstraintA
@ConstraintB
private String type;
//getters and setters
}
通常需要接受两个约束才能使字段有效。 Bean验证是否有可能以ConstraintA
有效的方式进行配置,只检查ConstraintB
并且只有当两者都失败时才会使字段无效?
编辑:更多解释...... 假设ValidatorA用于ConstraintA,ValidatorB用于ConstraintB。在典型配置中,Bean Validation的工作方式如下:
if (validatorA.isValid(car.type) && validatorB.isValid(car.type)) {
validate(car);
}
我想问一下,如果有一种方法可以通过这样的方式进行配置:
if (validatorA.isValid(car.type) || validatorB.isValid(car.type)) {
validate(car);
}
答案 0 :(得分:4)
我不确定我得到了你的要求,但如果你打算在@Contraint2
没有失败时只执行@Contraint1
验证,你可以使用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
元注释中声明验证器。