假设一个类A关联了类B,我需要A和B之间的数据验证,所以我在A类类级别上添加了自定义注释,并将其放在不同的组中,这样我可以控制执行顺序,但是它似乎只对A有效,我希望在A和B上完成基本验证之后执行自定义验证,但似乎不行,B上的验证是在之后执行的,如何使其在自定义验证之前执行? 以下是示例代码:
@XXXValidation(groups = Second.class)
@GroupSequence({A.class, Second.class})
public class A {
@valid
private B b;
}
public class B {
@NotNull
private String name;
}
最佳答案
在类级别使用@GroupSequence
重新定义默认组的组序列。这是类的本地属性,不会传播到任何关联。 默认组将在关联的类中进行验证。另请参阅 Bean Validation 规范中的相关章节 - http://beanvalidation.org/1.1/spec/#constraintdeclarationvalidationprocess-groupsequence-redefiningdefaultgroup 。
@Valid is an orthogonal concept to the notion of group. If two groups are in sequence, the first group must pass for all associated objects before the second group is evaluated. Note however that the Default group sequence overriding is local to the class it is defined on and is not propagated to the associated objects.
如果您想确保整个对象图按照给定的组顺序进行验证,那么您需要在对 Validator.validate 的顶级调用中“请求”此顺序。如果您自己控制验证,这应该很简单。如果您使用 Bean Validation 作为另一个框架的一部分,则需要引用其文档以了解如何指定组。例如,JPA 定义了一组可以设置的属性(例如在 persistence.xml 中),以便定义应将哪些组(序列)作为 JPA 生命周期事件的一部分进行评估。
根据您的用例,您也许也可以使用@ConvertGroup。查看规范或online documentation以 Hibernate Validator 为例。
关于java - 如何在类级别注释之前对用@valid注释的属性执行验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37475419/