2020-03-05 16:30:01.380 ERROR 12216 --- [rtTask_Worker-1] i.e.l.e.h.i.DefaultJobExceptionHandler 33 : Job 'com.task' exception occur in job processing org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'org.springframework.transaction.PlatformTransactionManager' available: expected single matching bean but found 5: aaaTransactionManager,bbbTransactionManager,cccTransactionManager,dddTransactionManager,eeeTransactionManager
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1041)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:345)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:340)
at org.springframework.transaction.interceptor.TransactionAspectSupport.determineTransactionManager(TransactionAspectSupport.java:370)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:272)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:673)
at com.service$$EnhancerBySpringCGLIB$$42f7daa9.retry(<generated>)
问题的原因在于早期项目中只有一个数据源,也只有一个与该数据源绑定的事务管理器,因此直接使用@Transactional()注释时Spring会帮助我们自动识别出来,但是后期当项目中同时出现两个数据源和两个相关的事务管理器时,在使用@Transactional()注解时如果不直接指定,Spring就不知道具体使用哪一个事务管理器来进行事务管理了,因此需要通过某种方式来具体指定一下。
指定的方式可以通过使用 @Transactional(transactionManager = “aaaTransactionManager”) 来进行指定
ps:
关于bean的生成,可以是直接创建后配置,也可以是
的
BeanDefinitionReaderUtils.registerBeanDefinition(dynamicDataSourceBeanDefinitionHolder, beanDefinitionRegistry);