应用程序抛出以下错误:
org.springframework.beans.factory.NoUniqueBeanDefinitionException:没有 合格的bean类型 [org.springframework.transaction.PlatformTransactionManager]是 已定义:预期单个匹配bean但找到3
您好我们有一个webapp,我们升级到上面的配置,运行在 java 8,tomcat 8 上。在与数据库的第一次交互(写入事务)时,应用程序抛出上述错误。
我们使用了 Spring的Hibernate事务管理器实现。我们将 spring aop 定义为包含 bo方法与事务以及针对某些例外的必要操作(基本回滚)的事务建议。
注意: JDK和tomcat也升级,从6到8
在升级Spring,Hibernate,tomcat和java之前,我们在应用程序中使用了相同的配置(如下所述),这些配置正在且仍在正常工作,即使我们遇到此错误也没有。
每个数据源,会话工厂和事务管理器定义如下 数据源是这样的
session factory configuration
<bean id="sessionFactory1" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource1"/>
<property name="mappingResources">
<list>
<!-- List of hbm mappings -->
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.generate_statistics">true</prop>
<prop key="hibernate.format_sql">false</prop>
<prop key="hibernate.use_sql_comments">false</prop>
<prop key="hibernate.connection.release_mode">after_transaction</prop>
<prop key="hibernate.c3p0.timeout">1</prop>
</props>
</property>
</bean>
Transaction manager, transaction advice and aop config
<bean id="transactionManager1" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory1"/>
</bean>
<tx:advice id="defaultTxAdvice1" transaction-manager="transactionManager1">
<tx:attributes>
<tx:method name="get*" read-only="true"/>
<tx:method name="*" rollback-for="com.xyz.platformcore.common.exception.VyasaException"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="serviceOperation1" expression="execution(* com..*BO.*(..)) || execution(* com..*Bo.*(..)) || execution(* com..*bo.*(..)) || execution(* com.xyz.platformcore..*BO.*(..)) || execution(* com.xyz.framework..*bo.*(..)) || execution(* com.xyz.framework..*Bo.*(..)) || execution(* com.xyz.platformcore..*Bo.*(..)) || @annotation(com.xyz.platformcore.common.hibernate.VyasaTransactionAwareHibernateOperation) || within(@com.xyz.platformcore.common.hibernate.VyasaTransactionAwareHibernateOperation *)" />
<aop:advisor advice-ref="defaultTxAdvice1" pointcut-ref="serviceOperation1"/>
</aop:config>
My dao method
public void invalidateSomeThing() {
Query query = getSession1().createQuery("update SomeThing set isActive =:isActive");
query.setParameter("isActive", false);
query.executeUpdate();
}
getSession1() gives the Session object from SessionFcatory1 which connects to DataSource1
非常感谢任何帮助
答案 0 :(得分:0)
正如Spring文档中所述:
<强> NoUniqueBeanDefinitionException 强>
当向BeanFactory请求bean实例时抛出异常 当只有一个时,找到了多个匹配的候选者 期待匹配的豆。
基本上,你有三个具有相同标识符和/或名称的org.springframework.transaction.PlatformTransactionManager
的Spring“bean”。最终,您可以拥有任意多个,但Spring容器必须有一种方法来“识别”它们......通常按类型,然后按名称。
尝试在启动时以debug
模式记录输出;它将逐步告诉你正在加载的bean是什么以及类似的东西。在任何情况下,您的配置中都应该有三个定义org.springframework.transaction.PlatformTransactionManager
。
答案 1 :(得分:0)
请检查一下......“当多个事务管理器定义”
时,事务管理器缓存无法重新填充https://jira.spring.io/browse/SPR-14609
它是Spring FW 4.3.2版本中的一个错误。已在4.3.3中修复。
此致 --Yash