我使用@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;
}
}
答案 0 :(得分:1)
在我看来,这就像一个黑客。有两个原因:
共同点是“初始化代码”。为了达到你想要的效果,你可以在验证发生之前注册一个监听器并执行初始化方法。 Here's hibernate-validator的文档 - 它告诉你有关事件监听器的信息。
您还可以在服务层中手动设置默认值(因为您似乎使用的是贫血数据模型)。因为这看起来像是一个业务逻辑,所以在持久化对象之前,最好是在服务方法中。
答案 1 :(得分:0)
最后我解决了我的问题。
验证验证器堆栈跟踪,我已经看到它首先处理beanValidators,然后是memberValidators。所以我唯一要做的就是在类约束中定义我的初始化代码。
我已经定义了一个新的类注释,根据所接收的pojo的类型,我设置了默认值。
我已经验证此代码是在执行之前执行的,而不是像@NotEmpty等任何其他(成员)constarint。