【问题标题】:JSR 303 Cross field Validation by defining custom constrains: performence issuesJSR 303 通过定义自定义约束进行跨字段验证:性能问题
【发布时间】:2013-06-13 03:54:26
【问题描述】:

我有一个包含内部 bean 的复合 bean,其中一些内部 bean 也有内部 bean。这个复合 bean 总共有 200 多个属性(这个 bean 的属性 + 内部 bean 的属性)。我正在使用 JSR 303 来验证用户输入。我的要求建议进行跨字段 bean 验证。

我浏览过一些博客和建议,例如 http://dwuysan.wordpress.com/2012/03/20/cross-field-validation-using-bean-validation-jsr-303/ ,关于同样的事情。类似的解释可以在这里找到:Cross field validation with Hibernate Validator (JSR 303)。

两者都建议使用相同的方法来定义跨字段验证的类级别约束。他们的方法是使用 BeanUtils.getProperty() 方法,该方法又在运行时使用 Java Reflections,同时执行 bean 验证.

我想知道,使用在运行时评估(性能下降)的反射来定义 JSR 303 corss-field 约束或通过自定义方法进行 Spring 验证或服务层验证等其他验证策略是否很好?

【问题讨论】:

    标签: java reflection bean-validation


    【解决方案1】:

    如果您的要求只是实现一些跨字段验证规则,我建议实现专用的类级约束,只需调用它们的 getter 即可访问相关属性。这使得约束类型保存并避免反射。

    如果您有很多跨领域验证,这使得为所有这些验证创建专用约束是一项乏味的任务,那么像 @FieldMatch 这样的通用方法可能会节省一些工作。我认为在大多数情况下,反射的开销应该可以忽略不计。如果您看到性能下降,您仍然可以针对最关键的情况实施特定的类级别约束。

    【讨论】:

    • 据我所知,关于 JSR 303,注释仅对其应用的字段可见(不使用反射)。如何使用 getter 和 setter 来实现这种验证?你能详细说明一下吗?
    • 您不仅可以将约束应用于属性/字段,还可以将约束应用于整个类(类级约束)。这种约束的验证器将完整的 bean 传递给它的 isValid() 方法,因此可以访问它的所有属性。有关详细信息,请参阅 Hibernate 验证器 reference guide。
    猜你喜欢
    • 2011-10-23
    • 2012-08-20
    • 1970-01-01
    • 2011-08-09
    • 2010-12-30
    • 1970-01-01
    • 2015-07-31
    • 2015-03-28
    相关资源
    最近更新 更多