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

时间:2019-02-19 09:33:09

标签: java spring spring-boot

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

  

创建名称为'adminServiceImpl'的bean时出错:不满意   通过字段'taskExecutor'表示的依赖关系;嵌套异常为   org.springframework.beans.factory.NoSuchBeanDefinitionException:否   类型的合格豆   'org.springframework.scheduling.concurrent.ThreadPoolTask​​Executor'   可用:至少有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'   可用。

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

1 个答案:

答案 0 :(得分:3)

这是一个有趣的安排,但是很有可能不取决于ApplicationContext如何处理bean定义。

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

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

自从升级到Spring Boot 2.1之后,您仍然可以减少配置:

@EnableScheduling
@EnableAsync
@Configuration
public class MyConfiguration {}

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

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