Почему tx-аннотации приводят к конфликту? - PullRequest
1 голос
/ 24 мая 2019

Привет всем, я работаю с Spring MVC и у меня есть вопрос.

У меня есть определение компонента для транзакции:

<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 DEBUG o.s.b.d.LoggingFailureAnalysisReporter - Приложение не удалось запустить из-за исключения org.springframework.beans.factory.support.BeanDefinitionOverrideException: Неверное определение бина с именем 'Org.springframework.transaction.config.internalTransactionAdvisor' определено в ресурсе пути к классу [Орг / springframework / транзакция / аннотации / ProxyTransactionManagementConfiguration.class]: Невозможно зарегистрировать определение bean-компонента [Root bean: class [null]; Объем =; абстрактные = ложь; lazyInit = ложь; autowireMode = 3; dependencyCheck = 0; autowireCandidate = TRUE; первичные = ложь; factoryBeanName = org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration; factoryMethodName = transactionAdvisor; initMethodName = NULL; destroyMethodName = (вывод); определено в ресурсе пути к классу [Орг / springframework / транзакции / аннотаций / ProxyTransactionManagementConfiguration.class]] для бобов 'Org.springframework.transaction.config.internalTransactionAdvisor': Уже есть [Root bean: класс [Org.springframework.transaction.interceptor.BeanFactoryTransactionAttributeSourceAdvisor]; Объем =; абстрактные = ложь; lazyInit = ложь; autowireMode = 0; dependencyCheck = 0; autowireCandidate = TRUE; первичные = ложь; factoryBeanName = NULL; factoryMethodName = NULL; initMethodName = NULL; 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'

1 Ответ

1 голос
/ 25 мая 2019

Что вам нужно сделать, это включить Bean Overriding.С весны 2.1 по умолчанию это отключено.Вы получаете исключение, потому что уже существует компонент с таким именем.

Отрывок примечания к выпуску Spring 2.1: Примечание к выпуску 2.1 - Переопределение бина

Короче говоря, вам нужно добавить это в ваш файл application.properties:

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

Или в ямле:

spring:
   main:
     allow-bean-definition-overriding: true
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...