使用Spring和Hibernate的Java应用程序从3.2.1升级到4.3.2和4.2.0升级到5.2.1抛出错误

时间:2016-12-05 14:41:15

标签: java spring hibernate aop spring-transactions

应用程序抛出以下错误:

  

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

非常感谢任何帮助

2 个答案:

答案 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