Bean Validation 验证一个验证是否有效?

3
假设有这样一个 Bean:
public class Car {
     @ConstraintA      
     @ConstraintB
     private String type;

     //getters and setters
}

通常情况下,为了使字段有效,必须接受两个约束条件。在Bean Validation中,是否有可能以这样一种方式配置,即如果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);
} 
1个回答

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 Validator,则可以这样做。虽然它是JSR-303的参考实现,但提供了@ConstraintComposition(OR)扩展,同时创建新的自定义组合验证规则:

@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 元注释中声明验证器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接