【问题标题】:Cannot Autowired a dependency into customized validator无法将依赖项自动装配到自定义验证器中
【发布时间】:2022-01-01 01:16:03
【问题描述】:

我正在寻找使用自定义验证器来验证我的对象属性,并且我需要注入一些 bean。所以我不能自动装配任何豆子,我得到了这个例外:

java.lang.NoSuchMethodException: com.*.*.MyValidatorValidator.<init>()
    at java.base/java.lang.Class.getConstructor0(Class.java:3517)
    at java.base/java.lang.Class.getConstructor(Class.java:2238)
    at org.hibernate.validator.internal.util.privilegedactions.NewInstance.run(NewInstance.java:41)
    ... 110 common frames omitted

如何成功自动装配 bean?

@Slf4j
@RequiredArgsConstructor
public class MyValidator implements ConstraintValidator<ValidMapper, String> {
    
    private MyService myService;
  
    @Autowired
    public MyValidator(MyService myService) {
        this.myService= myService;
    }
    @Override
    public boolean isValid(String valueToValid, ConstraintValidatorContext context) {  
        // Some code using MyService
        return true;
    }
}

【问题讨论】:

  • 您需要添加代码以便我们为您提供帮助。谢谢!
  • 验证器需要被验证框架(这里是 Hibernate Validator)实例化,并且它们不是 Spring bean,因此自动装配通常不可用。如果您解释您的验证概念,我们可能会提供帮助。 (另请注意,如果您将 Lombok 与 Spring bean 一起使用,则可以只使用 @RequiredArgsConstructor;如果您只有一个构造函数,则不需要 @Autowired。)
  • ..但我认为它仍然可行/可能/容易;)(我会在回答之前进行测试:)

标签: java spring-boot bean-validation


【解决方案1】:

听起来正确,@chrylis-cautiouslyoptimistic-,但仍然值得一试(为什么“验证器”不能被“弹簧管理”!?;)

我尝试了一种解决方法(您的原始错误消息):省略构造函数注入并使用字段注入 - 它奏效了!

但核心问题/修复(通常)是:


使用 @Autowired,引用对象必须是“弹簧管理的”


所以:

  • 或声明:

    @Component // this enables `@Autowried` on this class
    //@Scope("request") makes also sense on this type of "bean"
    public class MyValidator ...
    
  • 或在(其中一个)应用程序配置中进行初始化:

    @Bean // this enables `@Autowried` on this ..
    @Scope("request")
    public MyValidator myValidator() {
        MyValidator result = new MyValidator(); // ..object.
        // ... customize more ...
        return result;
    }
    

(保持原样)应该“解决”您的问题。

【讨论】:

    猜你喜欢
    • 2019-02-03
    • 2014-01-15
    • 1970-01-01
    • 2014-01-15
    • 2020-03-23
    • 2022-08-13
    • 2016-08-17
    • 2013-09-27
    • 1970-01-01
    相关资源
    最近更新 更多