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)
注释无法识别查看已修改字段的字段,因为可以有多个字段 。
- Spring MVC – REST服务中bean列表上的@Valid
- 如何在JBoss 6.4中禁用javax.validation.api
- 如何让Spring MVC在JUnit测试中调用validation?
- Hibernate Validator – @Length – 如何为min和max指定单独的消息?
- ValidationMessages.properties文件之间的冲突
- 使用Java EE 6 Beanvalidation
- Springvalidation器:同时具有注释和validation器实现
- unit testing的良好模式形成了在Spring MVC中具有基于注释的validation的bean
- JSR303自定义validation器被调用两次