当前位置: 首页 > 知识库问答 >
问题:

如何将(@autowired)@服务注入ConstraintValidator?

满和安
2023-03-14

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

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

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

不幸的是,它对我没有作用。我在字段(在实现ConstraintValidator的类内)使用NullPointerException累加stacktrace:

@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");
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)

共有1个答案

公孙弘图
2023-03-14

我的环境是spring-boot,下面的代码对我的验证类进行了org.springframework.stereoType.component注释。

@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);
  }
}
 类似资料:
  • 问题内容: authService.getLoggedin()返回false或true取决于用户是否登录。然后,我想不允许他们进入网址,如果不允许的话。 但是我收到此错误:错误:[$ injector:modulerr]由于以下原因无法实例化模块WikiApp:[$ injector:unpr]未知提供程序:authService 问题答案: 在配置阶段,您只能要求提供程序($ routeProv

  • 我有个问题..我正在创建一个aspectj类,在我的类中我需要访问一个spring-boot服务,但是当我尝试使用@AutoWired或通过构造函数注入它时,我出现了一个错误: 有人能帮帮我吗?

  • 问题内容: 我需要将两个对象注入。其中一个是的实例,我得到这样的信息: 那么如何在我的services.yml中声明呢?这是服务: 问题答案: 我找到了此链接,这对我有用:

  • 问题内容: 我写了一个AngularJS服务,我想对其进行单元测试。 我的app.js文件已注册: 我可以测试DI是否像这样工作: 这证明了可以通过DI框架创建服务,但是接下来我要对服务进行单元测试,这意味着要模拟注入的对象。 我该怎么做呢? 我试过将我的模拟对象放在模块中,例如 并将服务定义重写为: 但是后者似乎停止了DI所创建的所有服务。 有人知道我可以如何为单元测试模拟注入的服务吗? 谢谢

  • 问题内容: 我怎样才能像注入的依赖,,,,等的?在我的特定情况下,我需要通过以下方式注入Spring托管的: 但是,它没有注入,而是保留了null,导致。似乎,并且t也不起作用。 如何在验证器中注入服务依赖项,以便可以访问数据库? 问题答案: 在不被注入容器管理。你需要使其成为托管bean。使用Spring ,CDI @Named或JSF 代替,以便使其成为托管bean,从而有资格进行依赖项注入。

  • 问题内容: 是否可以在angularJS中将一个服务注入到另一个服务中? 问题答案: 是。遵循angularjs中的常规注入规则。 感谢@simon。最好使用数组注入以避免最小化问题。