问题描述
我更新了父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那样工作?
1楼
一个有趣的安排在这里起作用,但它很可能不取决于ApplicationContext
如何处理bean定义。
一方面公开了TaskExecutor
,另一方面,您正在请求具有不同类型的非常特定的bean。
上下文可能无法兑现,如果这正是您想要的,则必须将bean定义的返回类型缩小为ThreadPoolTaskExecutor
。
容易想到Spring Boot中新的自动配置支持与行为的改变有关,但是如果将它们都排除在外,这也会中断。
由于您已升级到Spring Boot 2.1,因此您仍然可以减少配置:
@EnableScheduling
@EnableAsync
@Configuration
public class MyConfiguration {}
请不要在配置类上使用@ConfigurationProperties
,这些是我们用来绑定环境的常规组件。
您仍然可以注入具有该名称的异步ThreadPoolTaskExecutor
或我们推荐的更精细的名称applicationTaskExecutor
。