【问题标题】:Why tx annotation-driven make a conflict?为什么 tx annotation-driven 会产生冲突?
【发布时间】:2019-10-11 05:20:23
【问题描述】:

大家好,我正在使用 Spring MVC,我有一个问题。

我有这个用于事务的 bean 定义:

<tx:annotation-driven transaction-manager="txManager"/>

    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

但是当我运行我的应用程序时,我遇到了这个异常:

2019-05-24 18:14:51 调试 o.s.b.d.LoggingFailureAnalysisReporter - 由于异常,应用程序无法启动 org.springframework.beans.factory.support.BeanDefinitionOverrideException: 带有名称的无效 bean 定义 'org.springframework.transaction.config.internalTransactionAdvisor' 在类路径资源中定义 [org/springframework/transaction/annotation/ProxyTransactionManagementConfiguration.class]: 无法注册 bean 定义 [Root bean: class [null];范围=; 摘要=假;懒惰初始化=假;自动线模式=3;依赖检查=0; 自动接线候选=真;主要=假; factoryBeanName=org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration; factoryMethodName=transactionAdvisor;初始化方法名=空; destroyMethodName=(推断);在类路径资源中定义 [org/springframework/transaction/annotation/ProxyTransactionManagementConfiguration.class]] 豆类 'org.springframework.transaction.config.internalTransactionAdvisor': 已经有 [Root bean: class [org.springframework.transaction.interceptor.BeanFactoryTransactionAttributeSourceAdvisor]; 范围=;摘要=假;懒惰初始化=假;自动线模式=0; 依赖检查=0;自动接线候选=真;主要=假; 工厂BeanName=空;工厂方法名=空;初始化方法名=空; destroyMethodName=null] 绑定。在 org.springframework.beans.factory.support.DefaultListableBeanFactory.registerBeanDefinition(DefaultListableBeanFactory.java:897) 在 org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForBeanMethod(ConfigurationClassBeanDefinitionReader.java:274) 在 org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForConfigurationClass(ConfigurationClassBeanDefinitionReader.java:141) 在 org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitions(ConfigurationClassBeanDefinitionReader.java:117) 在 org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:327) 在 org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:232) 在 org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:275) 在 org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:95) 在 org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:705) 在 org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:531) 在 org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:142) 在 org.springframework.boot.SpringApplication.refresh(SpringApplication.java:775) 在 org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:316) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:1260) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:1248)

当我评论 tx:annotation-drive 时,一切都很好,但是带有 @Transactional 注释的方法不起作用。我究竟做错了什么?

我的 gradle 依赖项:

compile group: 'org.springframework', name: 'spring-web', version: '5.1.5.RELEASE'
    compile group: 'org.springframework', name: 'spring-webmvc', version: '5.1.5.RELEASE'
    compile group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '2.1.3.RELEASE'
compile group: 'org.springframework', name: 'spring-jdbc', version: '5.1.5.RELEASE'

【问题讨论】:

    标签: java spring spring-boot spring-mvc


    【解决方案1】:

    您需要做的是启用Bean Overriding。从 Spring 2.1 开始,默认情况下禁用此功能。你得到一个异常,因为已经定义了一个同名的 bean。

    Spring 2.1 发行说明摘录:Release note 2.1 - Bean Overriding

    长话短说,您需要将此添加到您的 application.properties 文件中:

    spring.main.allow-bean-definition-overriding=true
    

    或者在yaml中:

    spring:
       main:
         allow-bean-definition-overriding: true
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-07
      • 2011-02-02
      • 2013-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-30
      相关资源
      最近更新 更多