我应该在setters中使用Hibernate验证程序进行验证吗?

我应该在setters中使用Hibernate验证程序进行验证吗?,hibernate,validation,annotations,setter,hibernate-validator,Hibernate,Validation,Annotations,Setter,Hibernate Validator,我知道在应用程序的多个层次上都需要验证。但是,如果要在所有层上实施的验证都相同(大多数情况下都是如此),那么使用公共验证框架是有意义的。这是Hibernate验证器的目标之一 为了确保对象的有效状态,我计划将验证放在实体的setter中。 此外,我在实体上设置了注释约束,以便Hibernate可以在持久化实体对象之前使用它们来验证实体对象。那么,与其编写自己的验证(本质上检查与Hibernate注释相同的约束),为什么我不应该在setters中使用验证器实例来验证属性呢。我可以使用validat

我知道在应用程序的多个层次上都需要验证。但是,如果要在所有层上实施的验证都相同(大多数情况下都是如此),那么使用公共验证框架是有意义的。这是Hibernate验证器的目标之一

为了确保对象的有效状态,我计划将验证放在实体的setter中。 此外,我在实体上设置了注释约束,以便Hibernate可以在持久化实体对象之前使用它们来验证实体对象。那么,与其编写自己的验证(本质上检查与Hibernate注释相同的约束),为什么我不应该在setters中使用验证器实例来验证属性呢。我可以使用
validator.validateProperty()

然而,我关心的是绩效。构建一个验证器工厂并在每个setter中获得一个验证器实例是否成本高昂?还是我对绩效考虑太多?若我不使用Validator,那个么我将选择ApacheCommons库在setter中进行验证

那么,哪种方法更好呢?

您可以看一看,它是自4.2以来Hibernate Validator的一部分(并且将是1.1版的Bean验证API的一部分),允许在调用时自动验证参数值。这样,您就可以根据您的体系结构,使用AOP、动态代理等来验证setter参数


与性能有关的是,通常应该为应用程序只创建一个
验证器工厂
,并将其缓存。从同一工厂检索验证器通常是一种廉价的操作。当然,实际成本取决于约束的类型和数量,因此您可以自己运行一些性能分析,看看是否存在任何热点。

次要补充:对于Hibernate Validator,还有一个问题()为了通过将属性约束传播到相应的参数来进一步简化这个用例,我已经实现了您的单验证器工厂建议。虽然方法级验证听起来很吸引人,但由于时间的限制,我决定不实现它。不过,如果时间允许,我将使用它。无论如何谢谢你!