SpringBoot конфликтует с режимом гибернации, используемым в зависимости

#hibernate #spring-boot #spring-transactions

#переход в спящий режим #весенняя загрузка #весенние транзакции

Вопрос:

У меня есть модуль на основе гибернации, который отлично работает при использовании в приложении, отличном от SpringBoot, интегрированном как зависимость в Maven.

Однако при попытке добавить тот же модуль в качестве зависимости в приложение SpringBoot происходит сбой приложения с:

 [2019-04-05 20:27:14.157] - 2060 WARNING [main] --- org.springframework.context.annotation.AnnotationConfigApplicationContext: Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.support.BeanDefinitionOverrideException: Invalid bean definition with name 'org.springframework.transaction.config.internalTransactionAdvisor' defined in class path resource [org/springframework/transaction/annotation/ProxyTransactionManagementConfiguration.class]: Cannot register bean definition [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration; factoryMethodName=transactionAdvisor; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/transaction/annotation/ProxyTransactionManagementConfiguration.class]] for bean 'org.springframework.transaction.config.internalTransactionAdvisor': There is already [Root bean: class [org.springframework.transaction.interceptor.BeanFactoryTransactionAttributeSourceAdvisor]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null] bound.
[2019-04-05 20:27:14.173] - 2060 SEVERE [main] --- org.springframework.boot.diagnostics.LoggingFailureAnalysisReporter: 

***************************
APPLICATION FAILED TO START
***************************

Description:

The bean 'org.springframework.transaction.config.internalTransactionAdvisor', defined in class path resource [org/springframework/transaction/annotation/ProxyTransactionManagementConfiguration.class], could not be registered. A bean with that name has already been defined in null and overriding is disabled.

Action:

Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true
  

Есть ли способ сообщить Spring Boot, чтобы он просто отключился и позволил модулю зависимостей самостоятельно управлять транзакциями?

Комментарии:

1. Немного сложно найти проблему, не зная ваших зависимостей и вашего кода, но я бы предположил, что у вас есть две зависимости от режима гибернации и связанные с ними компоненты через Spring и ваш собственный модуль. Разве вы не можете просто избавиться от Hibernate в своем приложении Spring или переписать конфигурацию своих модулей, чтобы создавать только компоненты, связанные с Hibernate, если они еще не присутствуют?

Ответ №1:

Я думаю, что ваша проблема в автоматической настройке, добавьте этот код для автоматической настройки :

@AutoConfigureBefore и @autoconfigurefter

Ответ №2:

С момента первоначального сообщения прошло более 2 лет, но недавно я снова столкнулся с этой проблемой. Я потратил еще несколько часов на расследование и пришел к выводу, что законного решения по-прежнему нет.

Мой первоначальный обходной путь заключался в том, чтобы отложить принятие Spring Boot в затронутом проекте.

Конечным решением является объединение всех видов использования Hibernate через единый микросервис с spring-boot-jpa , чтобы использование Hibernate содержалось в том же проекте, вместо того, чтобы быть подключенным как временная зависимость.