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

无法将依赖项注入ConstraintValidator实现

汝楷
2023-03-14

我已经尝试了几种方法来将依赖项注入我的ConstraintValidator实现中,但没有任何效果。我已经尝试了几乎所有的stackoverflow线程。我正在使用HiberNate Validator来实现自定义验证。我希望FileService被注入ApiMock

  1. 简单的@Autowired注释和构造函数注入:
@Component
public class ApiMockResponseValidator
    implements ConstraintValidator<MockResponse, ApiMockResponse> {

  @Autowired
  FileService fileService;

  private boolean validate(....) {
     // logic
  }

  @Override
  public boolean isValid(ApiMockResponse mockResponse, ConstraintValidatorContext context) {
    System.out.println("\n\n  --- " + fileService + " --- \n\n");  // remains null
    // validate()
  }
}

我只通过构造函数注入和删除@Component尝试了这一点,但没有任何效果,验证程序也没有实例化。简单<code>@Autowired</code>不注入依赖项,构造函数Autowired给出

Caused by: javax.validation.ValidationException: HV000064: Unable to instantiate ConstraintValidator: com.lendin.ib.utils.validator.ApiMockResponseValidator.
    at org.hibernate.validator.internal.util.privilegedactions.NewInstance.run(NewInstance.java:44)
...
...
Caused by: java.lang.NoSuchMethodException: com.test.ApiMockResponseValidator.<init>()
    at java.lang.Class.getConstructor0(Class.java:3082)
@Configuration
public class ValidatorConfig {


  @Bean
  @Autowired
  public Validator validator(AutowireCapableBeanFactory autowireCapableBeanFactory) {

    ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class).configure()
        .constraintValidatorFactory(
            new SpringConstraintValidatorFactory(autowireCapableBeanFactory))
        .buildValidatorFactory();
    Validator validator = validatorFactory.getValidator();

    return validator;
  }
}

即使在此之后,<code>fileService</code>也为空。

@Configuration
public class ValidatorConfig {

  @Bean
  @Primary
  @Autowired
  public Validator validator(final AutowireCapableBeanFactory autowireCapableBeanFactory) {
    new SpringConstraintValidatorFactory(autowireCapableBeanFactory);
    LocalValidatorFactoryBean x = new LocalValidatorFactoryBean();
    x.setConstraintValidatorFactory(
        new SpringConstraintValidatorFactory(autowireCapableBeanFactory));
    return x;
  }

}

这也无济于事,fileService为空。

有什么方法可以实现注入依赖吗?

我知道,如果<code>SpringConstraintValidatorFactory</code>可以实例化<code>ConstraintValidator</code>实现,Hibernate可以使用它而不是实例化实现本身,那么它就可以工作。


共有2个答案

胡俊美
2023-03-14

我有同样的问题,它解决了添加这在application.properties:

spring.jpa.properties.javax.persistence.validation.mode=none

在这里找到解决方案

司空镜
2023-03-14
匿名用户

如果 ConstraintValidator 实例是在 Spring 范围之外创建的(也许 Hibernate 就是这样做的),则依赖注入不受 Spring 管理。

作为一种变通方法,您可以创建一个< code>FileServiceHolder作为单例

class FileServiceHolder {
   private static final FileServiceHolder INSTANCE = new FileServiceHolder();
   private FileService fileService;

   private FileServiceHolder() {
   }

   public static FileServiceHolder getInstance() {
      return INSTANCE;
   }

   @Autowired
   public setFileService(FileService fileService) {
      this.fileService = fileService;
   }
}

配置类中,从该单例创建一个 bean

@Configuration
class AppConfig {
   @Bean
   FileServiceHolder fileServiceHolder() {
      return FileServiceHolder.getInstance();
   }
}

将同一对象(singleton)作为bean公开,使得Spring可以注入依赖项。这是通过setter方法<code>setFileService</code>完成的。

现在在你的 Validator 类中,你可以通过 FileServiceHolder 访问 FileService

class Validator {
   boolean validate(....) {
      FileServiceHolder.getInstance().doStuff();
   }
}

 类似资料:
  • 问题内容: 我想将依赖项注入。但是,我的方法不起作用。我可以看到Spring正在调用我的setter方法,但是稍后在调用when时,该属性为。 这是我的设置: ServletContextListener: web.xml :(这是文件中的最后一个侦听器) applicationContext.xml: 输出: 实现此目的的正确方法是什么? 问题答案: 我通过删除侦听器bean并为我的属性创建了一

  • 我正在创建一个带有注释的豆子。 我遇到以下异常 无法自动连线字段:private java.util.ArrayList com.mypackage.MyClass.myFriends;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException:找不到 [java.util.ArrayList] 类型的匹配 bean,

  • 问题内容: 我试图将Spring依赖项注入到JPA EntityListener中。这是我的侦听器类: 这是我的Entity类: 但是,我的依赖项(即)始终为null。 问题答案: 注入对无状态bean的依赖关系的一种方法是将依赖关系定义为“静态”,创建一个setter方法,以便Spring可以注入依赖关系(将其分配给静态依赖关系)。 将依赖项声明为静态。 创建一个方法,以便Spring可以注入它

  • 本文向大家介绍asp.net-core 将依赖项注入Controller Action,包括了asp.net-core 将依赖项注入Controller Action的使用技巧和注意事项,需要的朋友参考一下 示例 鲜为人知的内置功能是使用的Controller Action注入FromServicesAttribute。 重要说明是,[FromServices] 不能将其用作常规的“属性注入”或“

  • 我只是从喷气背包和剑柄开始。但是当我注入到ViewModel中时,我遇到了一些问题。 我得到的错误: 我可以在活动中注入所有细节,但不能在ViewModel中注入。我已经尝试了所有我能找到的解决办法。 我的gradle文件: 项目根级别: 模块级: 我的申请文件 我的模块文件: 项目是具有可组合屏幕的单个活动,因此主要活动: 视图模型: 我尝试过的事情: 改为ViewModelComponent而