使用bean验证生成默认约束消息模板

时间:2015-07-14 20:17:58

标签: java validation jpa bean-validation validationmessage

如果在注释本身上没有定义此类消息模板,我将如何为约束(在JPA实体中)生成默认消息模板。

这就是我的意思。假设我有一个JPA实体'Dummy':

@Entity
public class Dummy {
    @Column
    @NotNull
    Long id;
}

另外,假设我有一个ValidationMessages.properties文件,其中包含:

Dummy.id.NotNull=ID of dummy should not be null

现在,如果我将@NotNull约束定义为@NotNull(message = {Dummy.id.NotNull}),那么一切都会运行良好,但如果我想生成'{Dummy.id.NotNull}'模板怎么办?在运行中(使用反射)所以我不必在每个约束上写相同的标准化模板?我使用MessageInterpolator类尝试了这个,但是只有在定义了message属性时才会调用插值方法,这会破坏我正在尝试做的目的。

所以,为了使自己清楚,我如何让验证器询问我的代码块“嘿,在'Dummy'类中字段'id'上的约束'NotNull'的消息是什么',即使它有没有分配消息(或者更确切地说,它已分配了默认消息)?“

1 个答案:

答案 0 :(得分:1)

我错了 - 即使没有在注释上定义显式消息,也会调用MessageInterpolator。这几乎回答了我的问题。剩下的唯一事情就是弄清楚如何获得正在验证的字段名称。

编辑:

最后,我被迫为构造函数中传递字段名称的每个字段实现MessageInterpolator类,并在验证字段时使用该MessageInterpolator创建Validator。我觉得这并不令人满意,但这是我能想到的唯一解决方案。

在本文中,我发现在访问注释实例时无法追溯带注释的元素(无论是字段,方法,类还是参数),这很有趣。如果这是可能的,我将能够动态获取字段名称,但这似乎是“缺乏”Java,所以没有什么可以做。