Java 在Spring集成中使用多个事务管理器时出现NoniqueBeandDefinitionException
我使用SpringIntegrationXML配置轮询一些数据库表,然后进行一些处理。在我们引入多个数据源之前,一切都很正常。在此之后,我们将得到间歇性的异常 问题是我们不知道这个异常来自哪个轮询器(我们使用的是基于xml的配置),因为我们有很多轮询器。由于堆栈跟踪显示了Java 在Spring集成中使用多个事务管理器时出现NoniqueBeandDefinitionException,java,spring-boot,spring-integration,eclipselink,Java,Spring Boot,Spring Integration,Eclipselink,我使用SpringIntegrationXML配置轮询一些数据库表,然后进行一些处理。在我们引入多个数据源之前,一切都很正常。在此之后,我们将得到间歇性的异常 问题是我们不知道这个异常来自哪个轮询器(我们使用的是基于xml的配置),因为我们有很多轮询器。由于堆栈跟踪显示了AbstractPollingEndpoint.java,因此我们查看了所有轮询器,并验证了事务管理器的设置是否正确 代码: 有没有办法找到位于AbstractPollingEndpoint$poller$1开头的轮询器的id。
AbstractPollingEndpoint.java
,因此我们查看了所有轮询器,并验证了事务管理器的设置是否正确
代码:
有没有办法找到位于AbstractPollingEndpoint$poller$1开头的轮询器的id
。从下面的堆栈运行,以便我们可以进一步调试它
或者多数据源配置中缺少的任何其他内容。在stacktrace中可以看到:
org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [org.springframework.transaction.PlatformTransactionManager] is defined: expected
single matching bean but found 2: transactionManager,transactionManagerSec
所以问题是spring找到了两个符合条件的bean来进行自动连接。尝试使用@Shailesh建议的属性将一个bean设置为主bean:
<bean primary="true|false"/>
注意:您也可以通过xml进行配置
您可以使用@Transactional注释的value属性
(可选)指定要访问的PlatformTransactionManager的标识
被使用。这可以是的bean名称或限定符值
事务管理器bean。默认目标
如果没有特别说明,则仍然使用bean名称transactionManager
找到了合格的PlatformTransactionManager bean
官方您的主要问题是您有两个bean transactionManager和transactionManagerSec for JpaTransactionManager,您需要定义一个bean作为主bean,从版本5.2开始
我们在异常发生时为组件记录整个BeanDefinition
。因此,这样的信息必须出现在PollingConsumer
实例的日志中。我们已经注意到了这一点。有两个Eclipselink Jpa自动配置文件,其中一个具有@Primary
注释。我会用这个细节更新问题。@KhushbuTry在代码中使用@Transactional
来指定要使用的事务管理器。但是为什么问题是间歇性的呢?它偶尔会来。大多数情况下,它是有效的。这就是为什么我们想知道这个异常是从哪个Spring集成轮询器来的,因此,我们只能调试poller
@KhushbuI无法根据可用信息确定这一点。也许您可以向代码中添加更多日志,并对其进行测试,以确定导致此问题的路径,并与我们共享
org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [org.springframework.transaction.PlatformTransactionManager] is defined: expected
single matching bean but found 2: transactionManager,transactionManagerSec
<bean primary="true|false"/>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
<property name="dataSource" ref="dataSource" />
<qualifier value="transactionManagerOne"/>
</bean>
<bean id="transactionManagerSec" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactorySecondary"/>
<property name="dataSource" ref="dataSourceSec" />
<qualifier value="transactionManagerSecond"/>
</bean>
@Transactional("transactionManagerOne")