【问题标题】:Should I use Hibernate Validator inside setters for validation?我应该在 setter 中使用 Hibernate Validator 进行验证吗?
【发布时间】:2023-04-02 10:31:01
【问题描述】:

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

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

但是,我关心的是性能。构建一个 ValidatorFactory 并在每个 setter 中获取一个验证器实例是一件昂贵的事情吗?还是我对性能考虑太多了?如果我不使用 Validator,那么我将选择 Apache Commons 库在 setter 中进行验证。

那么,哪种方式更好?

【问题讨论】:

    标签: hibernate validation annotations setter hibernate-validator


    【解决方案1】:

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

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

    【讨论】:

    • 次要补充:对于 Hibernate Validator,还有一个问题 (HV-686),旨在通过将属性约束传播到相应的参数来进一步简化此用例。
    • 我已经实现了你的 Single ValidatorFactory 建议。虽然方法级别的验证听起来很吸引人,但我决定现在不实施它 - 时间限制。但是,我会在时间允许的情况下使用它。无论如何,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多