当前位置: 首页 > 知识库问答 >
问题:

带有Spring和HiberNate的Java应用程序从3.2.1升级到4.3.2和4.2.0升级到5.2.1投掷错误

公孙成仁
2023-03-14

应用程序抛出以下错误:

org.springframework.beans.factory.NoUniqueBean定义异常:没有定义[org.springframework.transaction.PlatformTransactionManager]类型的合格bean:预期的单个匹配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个答案

甄阳朔
2023-03-14

正如Spring文档中所述:

名词和定义例外

当BeanFactory被要求提供一个bean实例时引发异常,该实例已找到多个匹配的候选者,而预期只有一个匹配的bean。

所以基本上,你有三个org的Spring“bean”。springframework。交易PlatformTransactionManager具有相同的标识符和/或名称。最终,你可以想要多少就有多少,但是Spring容器必须有一种方法来“识别”它们。。。通常按类型,然后按名称。

尝试在启动时以debug模式记录输出;它会一步一步地告诉你正在加载的豆子是什么,以及诸如此类的事情。在任何情况下,你都应该有三个定义org。springframework。交易PlatformTransactionManager在您的配置中的某个地方。

陈功
2023-03-14

请看看这个。。。“定义多个事务管理器时,事务管理器缓存无法重新填充”

https://jira.spring.io/browse/SPR-14609

这是Spring FW 4.3.2版本中的一个bug。已在4.3.3中修复。

你好,亚什

 类似资料:
  • 当我将我的keycloak版本从3.2.1升级到4.5时,我遇到了以下异常。如果我从3.2.1转到keycloak 4.2.1我就不明白了。看起来像是keycloak 4.5特有的东西。

  • 原因:org。springframework。豆。工厂BeanCreationException:无法自动关联字段:私有组织。springframework。邮政javamail。JavaMailSender.com。xxx。服务impl。NotificationServiceImpl。邮件发送者;嵌套的异常是org。springframework。豆。工厂NoSuchBeanDefinition

  • 在android版本为4.1.2的时候,这段代码运行良好。但是在4.2.0之后,代码就不工作了,下面是我的代码 我的依赖是

  • 为了帮助大伙儿升级,我们为现在的Apache用户提供了一份重要信息的文档说明。这些只是一些简要说明,你可以从新特性文档或src/CHANGES文件中得到更多信息。 这篇文档仅仅描述了从版本 2.0 到 2.2 的变化,如果你是从1.3版进行升级的,请查考从1.3升级到2.0文档。 编译时配置的改变 编译过程与2.0版本非常相似,你曾经使用过的configure命令行(在安装目录下的build/co

  • 为了帮助大伙儿升级,我们为现在的Apache用户提供了一份重要信息的文档说明。这些只是一些简要说明,你可以从新特性文档或src/CHANGES文件中得到更多信息。 编译时配置的改变 Apache现在使用autoconf和libtool系统来进行安装进程的配置。这个系统用起来很像Apache1.3的APACI系统,但并不相同。 在普通的选择编译模块的基础上,Apache2.0把请求进程的主要部分移到

  • WARNING 本升级指南仅适用于 2.2 版本升级至 2.3 版本,如果你并非 2.2 版本,请查看其他升级指南,Plus 程序不允许跨版本升级! 更新代码 预计耗时: 2 小时 这是你自我操作的步骤,确认将你的 2.2 版本代码升级到 2.3 版本,如果你做过一些自定义修改可能会出现代码冲突,你需要解决。 升级依赖 预计耗时: 3 分钟 进入 Plus 程序目录,执行: composer up