java - 使用 GroupSequence 验证嵌套 bean 并一次应用每个组

标签 java validation groovy bean-validation hibernate-validator

我有几个嵌套类,我想验证它们的自定义约束。但是,我的自定义约束的 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/

相关文章:

java - 使用JDBC访问远程MySQL数据库时出现com.mysql.jdbc.exceptions.jdbc4.CommunicationsException

java - 防止重复但保留可逆重复插入顺序的集合?

java - Ljava.lang.String 类无法在 persistence.xml 中解析

java - 约束注释中的变量字段

regex - 正则表达式从Groovy GString中删除\“?

security - GroovyClassLoader parseClass安全

java - 如何通过Java反射动态创建Java类?

validation - 如何使用 scalaz 为应用程序编写函数

javascript - 是否有任何浏览器支持 HTML5 的 checkValidity() 方法?

reflection - 如何枚举特定包中的 groovy 类?