Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Spring集成中使用多个事务管理器时出现NoniqueBeandDefinitionException_Java_Spring Boot_Spring Integration_Eclipselink - Fatal编程技术网

Java 在Spring集成中使用多个事务管理器时出现NoniqueBeandDefinitionException

Java 在Spring集成中使用多个事务管理器时出现NoniqueBeandDefinitionException,java,spring-boot,spring-integration,eclipselink,Java,Spring Boot,Spring Integration,Eclipselink,我使用SpringIntegrationXML配置轮询一些数据库表,然后进行一些处理。在我们引入多个数据源之前,一切都很正常。在此之后,我们将得到间歇性的异常 问题是我们不知道这个异常来自哪个轮询器(我们使用的是基于xml的配置),因为我们有很多轮询器。由于堆栈跟踪显示了AbstractPollingEndpoint.java,因此我们查看了所有轮询器,并验证了事务管理器的设置是否正确 代码: 有没有办法找到位于AbstractPollingEndpoint$poller$1开头的轮询器的id。

我使用SpringIntegrationXML配置轮询一些数据库表,然后进行一些处理。在我们引入多个数据源之前,一切都很正常。在此之后,我们将得到间歇性的异常

问题是我们不知道这个异常来自哪个轮询器(我们使用的是基于xml的配置),因为我们有很多轮询器。由于堆栈跟踪显示了
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")