【问题标题】:Validating nested beans using a GroupSequence and applying each group all at once使用 GroupSequence 验证嵌套 bean 并一次应用每个组
【发布时间】:2016-07-14 05:29:02
【问题描述】:

我有几个嵌套类,我想在其上验证自定义约束。但是,我的自定义约束的验证器要求 Child 类中的字段不为空,否则将引发 NPE。

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

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

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

class Child {
    @NotNull
    String cannotBeNull
}

请注意,我的示例代码在 Groovy 中。

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

有没有办法让验证器先针对一个组验证整个对象图(在单个验证调用中),然后再验证 GroupSequence 中后续组中的任何约束?

【问题讨论】:

    标签: java validation groovy bean-validation hibernate-validator


    【解决方案1】:

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

    在您的情况下,您正在使用 @GroupSequence 重新定义类的默认序列。在这种情况下,如果Default 组针对Parent 进行验证,则首先验证Parent(又名Default)的约束,然后验证SecondPass 的约束。在这种情况下,仅针对实际 bean 更改默认组顺序。在这种情况下Parent。它不会通过对象图 (@Valid)。 Default 组跨越 @Valid 边界。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-18
      • 2020-11-22
      • 2016-08-21
      • 2023-02-22
      • 2017-08-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多