JSR 303跨字段验证定义自定义约束:性能问题

时间:2013-06-17 08:34:25

标签: java reflection bean-validation

我有一个包含内部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() 方法,该方法在执行bean验证时在运行时使用 Java Reflections

我想知道使用在运行时评估的反射(性能下降)来定义JSR 303 corss-field contrains或者通过自定义方法进行其他验证策略(如Spring Validation或Service层验证)是否合适?

1 个答案:

答案 0 :(得分:1)

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

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