没有“org.springframework.core.task.TaskExecutor”类型的合格bean可用

问题描述 投票:0回答:1

当我运行 Spring 应用程序时,我收到 NoUniqueBeanDefinitionException。 之后的应用程序运行良好,但我担心它可能会在将来导致意外错误。

堆栈跟踪:

16:49:18.003 [scheduling-1] DEBUG o.s.s.a.AnnotationAsyncExecutionInterceptor - Could not find unique TaskExecutor bean. Continuing search for an Executor bean named 'taskExecutor'
org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'org.springframework.core.task.TaskExecutor' available: expected single matching bean but found 3: applicationTaskExecutor,springCloudAzureCredentialTaskExecutor,taskScheduler
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1312)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:486)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:341)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:334)
    at org.springframework.aop.interceptor.AsyncExecutionAspectSupport.getDefaultExecutor(AsyncExecutionAspectSupport.java:244)
    at org.springframework.aop.interceptor.AsyncExecutionInterceptor.getDefaultExecutor(AsyncExecutionInterceptor.java:158)
    at org.springframework.aop.interceptor.AsyncExecutionAspectSupport.lambda$configure$2(AsyncExecutionAspectSupport.java:124)
    at org.springframework.util.function.SingletonSupplier.get(SingletonSupplier.java:109)
    at org.springframework.aop.interceptor.AsyncExecutionAspectSupport.determineAsyncExecutor(AsyncExecutionAspectSupport.java:183)
    at org.springframework.aop.interceptor.AsyncExecutionInterceptor.invoke(AsyncExecutionInterceptor.java:105)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:765)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:717)
    at com.medsys.medsysapi.security.WebSecurityConfig$$SpringCGLIB$$1.deleteExpiredTokens(<generated>)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:568)
    at org.springframework.scheduling.support.ScheduledMethodRunnable.runInternal(ScheduledMethodRunnable.java:130)
    at org.springframework.scheduling.support.ScheduledMethodRunnable.lambda$run$2(ScheduledMethodRunnable.java:124)
    at io.micrometer.observation.Observation.observe(Observation.java:499)
    at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:124)
    at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)
    at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
    at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305)
    at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
    at java.base/java.lang.Thread.run(Thread.java:833)

网络安全配置:

@Configuration
@EnableScheduling
@EnableAsync
@EnableMethodSecurity
public class WebSecurityConfig {

    @Async
    @Scheduled(fixedRate = 1000 * 60)
    public void foo() {
        ...
    }

}

我已经查看了有关此问题的其他线程,但它们都仅引用代码定义的对象,例如 Executor / TaskExecutor。在我的应用程序中,除了 TaskScheduler 之外,我还使用了 spring-cloud-azure-starter 插件,因此,springCloudAzureCredentialTaskExecutor 也出现了。

java spring azure
1个回答
0
投票

你的问题是你有 3 种不同的

TaskExecutor
bean 实现:

  1. 应用程序任务执行器
  2. springCloudAzureCredentialTaskExecutor
  3. 任务调度器

所以当 Spring 尝试运行时:

    @Async
    @Scheduled(fixedRate = 1000 * 60)
    public void foo() {
        ...
    }

它不知道 3 个 bean 中的哪个可用,然后抛出异常。为了解决这个问题,你需要告诉 Spring 使用哪一个。作为替代方案,您可以使用

@Primary
Qualifier
,请参阅链接

© www.soinside.com 2019 - 2024. All rights reserved.