JSF:JSR 303 Beanvalidation – 为什么在getter而不是setter?

我不明白为什么JSR 303(beanvalidation)是针对getter方法而不是setter的? 将它放在setter方法下是不是更合乎逻辑,因为那是进入字段的入口点,应该在此之前检查validation?

注释getter并不意味着在调用getter时执行validation。 它仅用于标识约束应适用的属性。

将约束放在(通常是公共的)getter而不是(通常是私有的)字段上的一大优点是约束是类型的公共API的一部分。 它们甚至会被添加到生成的JavaDoc中。 类型的用户知道哪种约束适用于它而不考虑其内部实现。

注释getter的另一个好处是可以将约束放在基类或接口上的方法中,也可以应用于任何子类型/实现。

这是一个非常好的问题和我从未注意过的事情。 但我想我知道答案(以及为什么我自己从来没有得到过这个问题)。

如果您正在考虑这一点,从注释的角度来看,注释定义了validation将发生的位置,然后将其置于getter上是没有意义的。 (为什么不在存储值本身时进行validation..)。 但这不是它的工作方式……

程序员需要告诉validation框架,需要validation哪些属性。 因此,您可以将注释直接放在属性(我更喜欢)上,也可以将其放在getter上。 它们都表示读操作。 框架需要读取您的类的所有属性,这些属性必须经过validation。 所以在这种情况下,穿上setter毫无意义..要理解的关键是视角……

我希望这是有道理的。

考虑以下代码:

public class BeanValidation { private int nameSetCount = 0; private int nameGetCount = 0; private String name; public String getName() { this.nameGetCount++; return name; } public void setName(String name) { this.nameSetCount++; this.name = name; } } 

将注释放在private String name;

注释仅仅通过查看字段就可以轻松识别字段

将注释放在public String getName()

注释只需查看返回的字段即可轻松识别字段

将注释放在public void setName(String name)

注释无法识别查看已修改字段的字段,因为可以有多个字段