Java 使用GroupSequence验证嵌套bean并同时应用每个组

Java 使用GroupSequence验证嵌套bean并同时应用每个组,java,validation,groovy,bean-validation,hibernate-validator,Java,Validation,Groovy,Bean Validation,Hibernate Validator,我有两个嵌套类,我想对它们验证自定义约束。但是,自定义约束的验证器要求子类中的字段不为null,否则它将抛出NPE 当我的自定义约束和默认约束都在同一个类上时,我知道我可以使用GroupSequence在应用另一组约束之前应用一组约束 我使用嵌套类尝试的类似设置如下所示: @MyConstraint(groups = SecondPass) @GroupSequence([Parent, SecondPass]) class Parent { @Valid Child child

我有两个嵌套类,我想对它们验证自定义约束。但是,自定义约束的验证器要求子类中的字段不为null,否则它将抛出NPE

当我的自定义约束和默认约束都在同一个类上时,我知道我可以使用GroupSequence在应用另一组约束之前应用一组约束

我使用嵌套类尝试的类似设置如下所示:

@MyConstraint(groups = SecondPass)
@GroupSequence([Parent, SecondPass])
class Parent {
    @Valid
    Child child
}

class Child {
    @NotNull
    String cannotBeNull
}
注意,我的示例代码是用Groovy编写的

对于嵌套类,Hibernate的ValidatorImpl似乎试图首先将所有指定的组应用于父级,然后应用于子级。因此,它会在检查cannotBeNull是否为null之前尝试验证MyConstraint,如果为null则抛出一个NPE


在验证GroupSequence中后面的组中的任何约束之前,是否有一种方法让验证器先针对一个组验证(在单个验证调用中)整个对象图?

我认为您的问题在于如何使用
@GroupSequence
。不幸的是,
@GroupSequence
有两种用法。一个是定义验证的顺序。这是在接口上使用
@GroupSequence
时发生的,该接口作为对验证程序的调用的一部分被请求。例如,
Validator.validate(bean,MyGroupSequenceInterfaceClass.class)
。在这种情况下,序列将应用于整个对象图

在本例中,您使用
@GroupSequence
重新定义类的默认序列。在这种情况下,如果为
父级验证
默认
组,则首先验证
父级
(又称
默认
)的约束,然后验证
第二阶段
的约束。在这个场景中,默认的组序列只为实际的bean更改。在这种情况下,
父项
。它不会沿着对象图传递(
@Valid
)。
Default
组通过
@Valid
边界传递