我更新了父pom以使用Spring Boot 2.1.2版本。在我修复的其他错误和过时中,有一个最令我困扰的问题:
创建名称为'adminServiceImpl'的bean时出错:不满意 通过字段'taskExecutor'表示的依赖关系;嵌套异常为 org.springframework.beans.factory.NoSuchBeanDefinitionException:否 类型的合格豆 'org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor' 可用:至少有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.ThreadPoolTaskExecutor' 可用。
我解决此问题的一种方法是在配置类中,将getAsyncExecutor()
方法的返回类型声明为ThreadPoolTaskExecutor
。完成之后,它可以工作。但是我想知道为什么它不能像2.0.2那样工作?
答案 0 :(得分:3)
这是一个有趣的安排,但是很有可能不取决于ApplicationContext
如何处理bean定义。
一方面公开了TaskExecutor
,另一方面,您正在请求具有不同类型的非常特定的bean。上下文可能无法兑现,如果这正是您想要的,则必须将bean定义的返回类型缩小为ThreadPoolTaskExecutor
。
很容易想到Spring Boot中新的自动配置支持与行为的改变有关,但是当它们都被排除在外时,它也会中断。
自从升级到Spring Boot 2.1之后,您仍然可以减少配置:
@EnableScheduling
@EnableAsync
@Configuration
public class MyConfiguration {}
请不要在配置类上使用@ConfigurationProperties
,这些是我们用来绑定环境的常规组件。
您仍可以注入具有该名称的异步ThreadPoolTaskExecutor
或我们推广的更精致的applicationTaskExecutor
。