当前位置: 代码迷 >> java >> 从springboot 2.0.2更新到springboot 2.1.2导致没有合格的类型异常的bean
  详细解决方案

从springboot 2.0.2更新到springboot 2.1.2导致没有合格的类型异常的bean

热度:84   发布时间:2023-08-02 11:02:00.0

我更新了父pom以使用Spring Boot 2.1.2版本。 在我修复的其他错误和过时之中,最令我困扰的是:

创建名称为'adminServiceImpl'的bean时出错:通过字段'taskExecutor'表示的不满意的依赖关系; 嵌套的异常是org.springframework.beans.factory.NoSuchBeanDefinitionException:没有类型为“ org.springframework.scheduling.concurrent.ThreadPoolTask??Executor”的合格Bean:应该至少有1个有资格作为自动装配候选的Bean。 依赖项注释:{@ org.springframework.beans.factory.annotation.Autowired(required = true),@ org.springframework.beans.factory.annotation.Qualifier(value =“ taskExecutor”)}

我的配置类如下所示:

@EnableScheduling
@EnableAsync
@Configuration
@ConfigurationProperties("thread.pool")
public class MyAsyncConfig extends AsyncConfigurerSupport {
...
@Bean(name = "taskExecutor")
@Override
@Primary
public TaskExecutor getAsyncExecutor() {
    final ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.initialize();
    return executor;
}

我自动装配的类定义了executor字段:

@Autowired
@Qualifier("taskExecutor")
private ThreadPoolTaskExecutor taskExecutor;

这曾经在springboot 2.0.2中起作用,但是当我移至2.1.2版本时,我得到了

org.springframework.beans.factory.NoSuchBeanDefinitionException:没有类型为“ org.springframework.scheduling.concurrent.ThreadPoolTask??Executor”的合格bean。

我解决此问题的一种方法是在配置类中,将getAsyncExecutor()方法的返回类型声明为ThreadPoolTaskExecutor 完成之后,它可以工作。 但是我想知道为什么它不能像2.0.2那样工作?

一个有趣的安排在这里起作用,但它很可能不取决于ApplicationContext如何处理bean定义。

一方面公开了TaskExecutor ,另一方面,您正在请求具有不同类型的非常特定的bean。 上下文可能无法兑现,如果这正是您想要的,则必须将bean定义的返回类型缩小为ThreadPoolTaskExecutor

容易想到Spring Boot中新的自动配置支持与行为的改变有关,但是如果将它们都排除在外,这也会中断。

由于您已升级到Spring Boot 2.1,因此您仍然可以减少配置:

@EnableScheduling
@EnableAsync
@Configuration
public class MyConfiguration {}

请不要在配置类上使用@ConfigurationProperties ,这些是我们用来绑定环境的常规组件。

您仍然可以注入具有该名称的异步ThreadPoolTaskExecutor或我们推荐的更精细的名称applicationTaskExecutor

  相关解决方案