有条件地阻止级联验证
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 实例更多(大小约束),则只会生成违反大小约束的约束。
给定 类:
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 实例更多(大小约束),则只会生成违反大小约束的约束。