我应该在setter中使用Hibernate Validator进行验证吗?

时间:2013-02-04 14:35:03

标签: hibernate validation annotations setter hibernate-validator

据我所知,应用程序的多个层都需要进行验证。但是,如果要在所有层中实施的验证是相同的(大多数时候都是这种情况),那么使用通用验证框架是有意义的。这是Hibernate Validator的目标之一。

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

然而,我关心的是表现。构建ValidatorFactory并在每个setter中获取验证器实例是一件代价高昂的事吗?或者我是否在考虑表现?如果我不使用Validator,那么我将选择Apache Commons库进行setter内的验证。

那么,哪种方式更好?

1 个答案:

答案 0 :(得分:2)

您可以查看method-level validation,它是自4.2以来Hibernate Validator的一部分(并将成为版本1.1的Bean Validation API的一部分),并允许在调用时自动验证参数值。这样,您可以使用AOP,动态代理等来验证setter参数,具体取决于您的架构。

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