【问题标题】:How to inject(@Autowired) @Service into ConstraintValidator?如何将(@Autowired)@Service 注入 ConstraintValidator?
【发布时间】:2015-09-29 03:52:24
【问题描述】:

我有一些对用户实体进行操作的 UserService。 我创建了自己的注释和 ConstraintValidator 类作为实现

我需要将该 UserService 注入 ConstraintValidator。而且,正如 spring 文档所说,在注册 bean 之后:

<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>

SpringConstraingValidatorFactory 是默认注册的,所以我可以很容易地将我的服务 @Autowired 到它里面。 (来源:http://docs.spring.io/spring/docs/3.1.x/spring-framework-reference/html/validation.html#validation-beanvalidation-spring-constraints

不幸的是,它对我不起作用。我在字段上收到带有 NullPointerException 的堆栈跟踪(在实现 ConstraintValidator 的类内部):

@Autowired
private UserService userService; //here

在调用服务时

@Override
public boolean isValid(String username, ConstraintValidatorContext constraintValidatorContext) {
    personService.doSomethingWithService(); //here
    return true;
}

这意味着,UserService 没有正确注入。我也尝试过使用 ApplicationContextAware - 在我的 ConstraintValidator 类中实现它,获取上下文并找到 bean:

(UserService) context.getBean("userService");

但这也没有帮助..我不知道我的代码有什么问题。最后是堆栈跟踪,其中包含很多异常,包括 NullPointer 和 RollbackException。

java.lang.NullPointerException
    com.reportme.model.validation.UsernameAvailableValidator.isValid(UsernameAvailableValidator.java:20)
    com.reportme.model.validation.UsernameAvailableValidator.isValid(UsernameAvailableValidator.java:9)
    org.hibernate.validator.internal.engine.ConstraintTree.validateSingleConstraint(ConstraintTree.java:308)
    org.hibernate.validator.internal.engine.ConstraintTree.validateConstraints(ConstraintTree.java:180)
    org.hibernate.validator.internal.engine.ConstraintTree.validateConstraints(ConstraintTree.java:124)
    org.hibernate.validator.internal.metadata.core.MetaConstraint.validateConstraint(MetaConstraint.java:85)
    org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraint(ValidatorImpl.java:463)
//...

org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Error while committing the transaction
    org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:526)
    org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:757)
    org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:726)
//...

javax.persistence.RollbackException: Error while committing the transaction
    org.hibernate.jpa.internal.TransactionImpl.commit(TransactionImpl.java:94)
    org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:517)

如有必要,我会使用 Spring 4,非常感谢您的帮助,谢谢!

【问题讨论】:

    标签: spring nullpointerexception transactions constraints


    【解决方案1】:

    我的环境是 spring-boot,下面带有 org.springframework.stereotype.Component 注释的代码正在运行,FYR。

    @Component
    public class FooValidator implements ConstraintValidator<Foo, Object> {
    
      @Autowired
      MyService service;
    
      @Override
      public void initialize(Foo constraintAnnotation) {
      }
    
      @Override
      public boolean isValid(Object value, ConstraintValidatorContext context) {
        return service.isValid(value);
      }
    }
    

    【讨论】:

    • 我使用的是 Spring Boot 1.4.1。而且,我执行相同的代码,但服务仍然为空。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-07
    相关资源
    最近更新 更多