我有几个嵌套类,我想验证它们的自定义约束。但是,我的自定义约束的 validator 要求 Child 类中的字段不为 null,否则它将抛出 NPE。
当我的自定义约束和默认约束都在同一个类上时,我知道我可以使用 GroupSequence 在应用另一组约束之前应用一组约束。
我尝试与嵌套类类似的设置看起来像这样:
@MyConstraint(groups = SecondPass)
@GroupSequence([Parent, SecondPass])
class Parent {
@Valid
Child child
}
class Child {
@NotNull
String cannotBeNull
}
请注意,我的示例代码是用 Groovy 编写的。
对于嵌套类,Hibernate 的 ValidatorImpl 似乎试图首先将所有指定的组应用于 Parent,然后应用于 Child。因此,它会在检查cannotBeNull是否为空之前尝试验证MyConstraint,如果是则抛出NPE。
有没有办法让 validator 首先针对一个组验证(在单个验证调用中)整个对象图,然后再验证 GroupSequence 中后续组中的任何约束?
最佳答案
我认为你的问题是你如何使用 @GroupSequence
这里。不幸的是, @GroupSequence
有两种用途。一是定义验证顺序。这是@GroupSequence
的时候用于接口(interface),并且该接口(interface)被请求作为对 Validator 的调用的一部分。例如,Validator.validate(bean, MyGroupSequenceInterfaceClass.class)
。在这种情况下,序列将应用于整个对象图。
在您的情况下,您正在使用 @GroupSequence
重新定义类的默认序列。在这种情况下,如果 Default
组已验证 Parent
,第一个约束 Parent
(又名 Default
),然后是 SecondPass
的约束被验证。在这种情况下,仅针对实际 bean 更改默认组顺序。在这种情况下Parent
。它不会沿着对象图传递( @Valid
)。 Default
组通过 @Valid
传递边界。
关于java - 使用 GroupSequence 验证嵌套 bean 并一次应用每个组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38366112/