java - 如何在类级别注释之前对用@valid注释的属性执行验证?

标签 java validation hibernate-validator

假设一个类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/

相关文章:

java - 记录测试结果

validation - 如何使用 Yup 验证电话号码但不是必需的?

mysql - 防止重复输入数据库

jsf - 验证 JSF 中的类级别 bean 验证约束

java - 如何在自定义验证注释上插入 ConstraintValidator 消息

java - 在考虑本地时区的情况下,将日期转换为java中的纪元秒

java - 让线程等待

asp.net - 即使控件是隐藏的,验证仍会在ASP.NET中触发吗?

java - 如何使用 Spring MVC JSR-303 Validator 将不同的模型类验证为一种形式

java - 在 Java 中设置 android 动画的插值器