6

阅读 JSR-303 的规范:

约束验证实现实例的生命周期未定义

在使用约束实现之前,Bean 验证提供程序会调用 initialize 方法。

每次验证给定值时,Bean 验证提供程序都会评估 isValid 方法。如果值无效,则返回 false,否则返回 true。isValid 实现必须是线程安全的。

我不太明白。在每次isValid调用之前调用initializeisValid应该是线程安全的吗?这是否意味着我不能在类级别中存储任何东西来初始化以稍后从isValid访问它?特别是我需要传递给初始化的注释实例。

有人可以解释一下吗?

4

3 回答 3

4

它并没有说initialize()应该在每次调用isValid(). isValid()在多次调用同一个注解之前只能调用一次。例如,它的 javadoc说:

初始化验证器以准备 isValid调用

于 2012-04-11T14:56:07.663 回答
3

initialize()方法对每个约束调用一次,而对约束isValid()的每个验证调用一次。

将传递给的注释(或它的单个属性)存储到isValid()验证器的字段中并稍后从isValid(). 您可以在Hibernate Validator参考指南中找到一个示例。

您只需要确保您的方法可以由多个线程并行调用(例如,您可能无法在没有同步的情况下isValid()从内部更改验证器的状态)。isValid()

于 2012-04-12T20:43:57.073 回答
1

还想提一下,每个类都使用 initialize() 初始化验证器。

所以如果你有 DummyClassA 和 DummyClassB 使用相同的验证器,初始化将被调用两次。DummyClassB 将初始化它自己的验证器,并且不会使用 DummyClassA 初始化的验证器,反之亦然。DummyClassA 或 DummyClassB 的任何新实例都将使用相同的验证器。因此,如果您有四个 DummyClassA 实例,它们都将使用为 DummyClassA 初始化的相同验证器。

所以...... DummyClassA 与验证器具有多对一关系,而 DummyClassB 也将与验证器具有多对一关系。

这是我的团队和我在阅读您阅读的行并担心它不是线程安全等时很好奇的事情!

于 2018-08-17T16:18:40.663 回答