有条件地阻止级联验证

Conditionally prevent cascading validation

给定 类:

class Foo {
    @Size(max = 1)
    @Valid
    private List<Bar> bars;
}

class Bar {
    @NotBlank
    private String snafu;
}

当 Foo.bars 上的大小约束失败时,如何应用验证来防止 Bar.snafu 被验证?

虽然我可以通过组转换和组序列的定义来实现。但我未能按照我想要的方式配置它。

虽然看起来像,但定义快速失败不是一个选项。

以下解决了这个问题:

interface Advanced {}

@GroupSequence({Default.class, Advanced.class})
interface Sequence {}

class Foo {
    @Size(max = 1)
    @Valid
    private List<Bar> bars;
}

class Bar {
    @NotBlank(groups = Advanced.class)
    private String snafu;
}

Foo foo = new Foo();
foo.bars = new ArrayList<Bar>();
foo.bars.add(new Bar());
foo.bars.add(new Bar());

Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
Set<ConstraintViolation<Foo>> constraintViolations = validator.validate(foo, Sequence.class)

现在,如果允许的 Bar 实例更多(大小约束),则只会生成违反大小约束的约束。