gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:17:55 25 4
gpt4 key购买 nike

假设有这样一个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);
}

最佳答案

我不确定我是否明白你的要求,但如果你打算只在 @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;

}

您还需要声明标记接口(interface)以指定组:

public interface Contraint1Group extends Default { }

public interface Constraint2Group {}

当未使用约束注释指定组时,第一个扩展 javax.validation.groups.Default 是默认值。


编辑 问题更新后:你可以,但前提是使用 hibernate validator ,虽然它是 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 元注释中声明 validator 。

关于java - Bean Validation 验证一个验证是否有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16944163/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com