不使用autowire的hibernate验证器

时间:2011-09-15 09:46:04

标签: spring bean-validation autowired hibernate-validator

我目前正在开发一个Jersey项目,并决定使用Hibernate验证器进行参数验证。注入Endpoint类的所有依赖项都已正确初始化。但是对于ConstraintValidator类中的那些依赖项,它总是抛出一个NPE。所以我按照Spring + hibernate指南和注册

的指南
  

bean id =“validator”class =“org.springframework.validation.beanvalidation.LocalValidatorFactoryBean”

并将@Autowired注释用于ConstraintValidator类中需要注入的服务。

使用它有副作用吗?有没有办法避免ConstraintValidator类中的自动装配注释并仍然注入值?我尝试在上下文中手动注册constraintValidator类作为bean,向我需要的服务添加属性引用,但是它会抛出空指针异常。

1 个答案:

答案 0 :(得分:2)

“Hibernate Validator - JSR 303参考实现 - 参考指南”介绍了一些关于portality的内容:

  

警告

     

依赖于ConstraintValidatorFactory的任何约束实现   特定于实现的行为(依赖注入,没有no-arg   构造函数等不被认为是可移植的。

那么,这是件坏事吗?在我看来,事实并非如此。当然,您现在已经耦合到DI容器(Spring),并且无法轻松地重用验证器(例如,当不使用Spring时)。另一方面,通过Spring工厂构建的验证器,您可以充分利用框架并执行非常繁重的工作(读取实体的修订数据并比较以前的状态,调用任意服务,增强或本地化验证消息,... )。

您必须非常小心的一点是,验证器的语义通常是只读,并且不应该通过调用它来引起副作用。例如,由于通过调用(事务)服务或读取验证器内的数据进行一些自动刷新,不要意外地将数据刷新到数据库。