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,以便执行初始化代码
您还可以在服务层中手动设置默认值(因为您似乎正在使用贫血数据模型)。因为这看起来像是一个业务逻辑,所以最好在对象持久化之前在服务方法中。最后我解决了我的问题 在调试验证程序堆栈跟踪时,我看到它首先处理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;
}
}