Java 是否可以使用Hibernate Validator设置验证顺序?

Java 是否可以使用Hibernate Validator设置验证顺序?,java,hibernate,validation,Java,Hibernate,Validation,我使用@AssertTrue注释来确保执行设置一些默认值的方法(总是返回true)。这些设置值验证为@NotEmpty(这些是字符串)。因此,我需要保证在使用@NotEmpty注释的字段之前,严格执行使用@AssertTrue注释的方法 简化的代码示例(不包括Hibernate注释): 在我看来,这像是一个黑客。原因有二: 您总是返回true并断言它,其唯一目的是执行初始化代码 您希望框架以特定的顺序访问和验证bean,以便执行初始化代码 共同点是“初始化代码”。为了实现您想要的,您可以注册

我使用
@AssertTrue
注释来确保执行设置一些默认值的方法(总是返回true)。这些设置值验证为
@NotEmpty
(这些是字符串)。因此,我需要保证在使用
@NotEmpty
注释的字段之前,严格执行使用
@AssertTrue
注释的方法

简化的代码示例(不包括Hibernate注释):


在我看来,这像是一个黑客。原因有二:

  • 您总是返回true并断言它,其唯一目的是执行初始化代码
  • 您希望框架以特定的顺序访问和验证bean,以便执行初始化代码
共同点是“初始化代码”。为了实现您想要的,您可以注册一个侦听器并在验证发生之前执行初始化方法。hibernate验证程序的文档—它告诉您有关事件侦听器的信息


您还可以在服务层中手动设置默认值(因为您似乎正在使用贫血数据模型)。因为这看起来像是一个业务逻辑,所以最好在对象持久化之前在服务方法中。

最后我解决了我的问题

在调试验证程序堆栈跟踪时,我看到它首先处理BeanValidator,然后处理MemberValidator。所以我唯一要做的就是在类约束中定义初始化代码

我定义了一个新的类注释,根据接收到的pojo的类型,我在其中设置默认值


我已经验证过,这段代码比任何其他(成员)constraint都要早执行,比如@NotEmpty等。

虽然我没有阅读javax.validation规范,但这种行为可能是特定于实现的,即使您在这里成功了,在下一次升级中,如果规范中没有定义,这种行为可能会改变。正如我所说,这不是正确的初始化方法。好吧,也许这不是正确的方法,但是,正确的方法是什么?因为我不知道这种方式,所以我使用它,因为它是有效的。在我的回答中,我发布了一个指向事件侦听器的链接——请查看它们。
public class MyClass {
   @NotEmpty
   private String myField = null;

   @SuppressWarnings("unused")
   @AssertTrue
   private boolean fillDefaultValues() {

      if (this.myField == null) {
         this.myField = "default value";
      }

      return true;
   }
}