我不确定我要问的是什么,但是如果您打算仅在@ 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是默认的扩展名.
问题更新后进行编辑:您可以,但仅当使用休眠验证器时(它是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元注释内声明验证器.