可以使用Hibernate Validator设置验证顺序吗?

时间:2010-01-20 17:45:42

标签: java hibernate validation

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

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

public class MyClass {
   @NotEmpty
   private String myField = null;

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

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

      return true;
   }
}

2 个答案:

答案 0 :(得分:1)

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

  • 你总是返回true并断言它的唯一目的是执行初始化代码
  • 您希望框架以特定顺序访问和验证您的bean以执行初始化代码

共同点是“初始化代码”。为了达到你想要的效果,你可以在验证发生之前注册一个监听器并执行初始化方法。 Here's hibernate-validator的文档 - 它告诉你有关事件监听器的信息。

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

答案 1 :(得分:0)

最后我解决了我的问题。

验证验证器堆栈跟踪,我已经看到它首先处理beanValidators,然后是memberValidators。所以我唯一要做的就是在类约束中定义我的初始化代码。

我已经定义了一个新的类注释,根据所接收的pojo的类型,我设置了默认值。

我已经验证此代码是在执行之前执行的,而不是像@NotEmpty等任何其他(成员)constarint。