当我运行 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 也出现了。
你的问题是你有 3 种不同的
TaskExecutor
bean 实现:
所以当 Spring 尝试运行时:
@Async
@Scheduled(fixedRate = 1000 * 60)
public void foo() {
...
}
它不知道 3 个 bean 中的哪个可用,然后抛出异常。为了解决这个问题,你需要告诉 Spring 使用哪一个。作为替代方案,您可以使用
@Primary
或 Qualifier
,请参阅链接。