У меня есть устаревший модуль Spring, в котором есть определения компонентов данных от dataSource до transactionManager (на основе C3P0 и Hibernate). Я хочу повторно использовать все эти определения bean-компонентов в приложении Spring Boot. Файлы сборки загрузки Spring по умолчанию генерируются из initializr. Во время работы я обнаружил следующую ошибку:

org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Generic.class]: @Bean definition illegally overridden by existing bean definition: Generic bean: class [com.mchange.v2.c3p0.ComboPooledDataSource]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=close; defined in class path resource*

DataSource - это bean-компонент внутри data-beans.xml. Я импортировал определение bean-компонента xml с помощью @Configuration:

@ImportResource({"classpath:data-beans.xml"})
public class XmlConfig {
}
0
StackFish 18 Май 2021 в 08:00

1 ответ

Лучший ответ

Решением было исключить автоконфигурацию источника данных:

@SpringBootApplication(exclude={DataSourceAutoConfiguration.class, TransactionAutoConfiguration.class})

Вы также можете установить следующее свойство для подавления предупреждения, но это не очень хорошая практика:

spring.main.allow-bean-definition-overriding=true
0
StackFish 20 Май 2021 в 02:51