Spring Boot 3多数据源集成测试启动失败排查求助
问题根源
报错Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaSharedEM_entityManagerFactory': Cannot resolve reference to bean 'entityManagerFactory' while setting constructor argument,核心原因是Spring Boot自动装配的JPA共享EntityManager组件,默认尝试引用未命名的entityManagerFactory bean,但自定义的两个数据源对应的EntityManagerFactory未明确指定默认实例,导致测试上下文无法识别依赖。
修复步骤
1. 标记默认EntityManagerFactory
在其中一个自定义JpaConfiguration类(如DefaultJpaConfiguration)的EntityManagerFactory和TransactionManager方法上添加@Primary注解,明确默认实例:
@Configuration @EnableJpaRepositories( basePackages = "com.your.project.default.repos", entityManagerFactoryRef = "defaultEntityManagerFactory", transactionManagerRef = "defaultTransactionManager" ) @EntityScan(basePackages = "com.your.project.entity") public class DefaultJpaConfiguration { @Primary @Bean(name = "defaultEntityManagerFactory") public LocalContainerEntityManagerFactoryBean defaultEntityManagerFactory( EntityManagerFactoryBuilder builder, @Qualifier("defaultDataSource") DataSource dataSource) { return builder .dataSource(dataSource) .packages("com.your.project.entity") .persistenceUnit("defaultPU") .build(); } @Primary @Bean(name = "defaultTransactionManager") public PlatformTransactionManager defaultTransactionManager( @Qualifier("defaultEntityManagerFactory") EntityManagerFactory entityManagerFactory) { return new JpaTransactionManager(entityManagerFactory); } // 自定义defaultDataSource配置... }
2. 调整集成测试类配置
在@SpringBootTest中指定加载自定义配置类,并排除默认的JPA自动配置,避免冲突:
@SpringBootTest(classes = {DefaultJpaConfiguration.class, LockingJpaConfiguration.class}) @EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, JpaAutoConfiguration.class}) public class YourIntegrationTest { // 测试逻辑 }
3. 清理启动类冗余配置
确保启动类未保留@EnableJpaRepositories和@EntityScan注解,避免与自定义配置的扫描规则冲突,保持与生产环境一致的配置逻辑。
4. 确保PersistenceUnit唯一
两个EntityManagerFactory的persistenceUnit名称需不同(如defaultPU和lockingPU),避免容器内bean标识冲突。
额外验证动作
- 确认application.yml中两个数据源的配置(URL、账号、密码)均指向目标数据库
- 检查
@EnableJpaRepositories的basePackages是否准确匹配对应Repository的路径 - 执行测试前清理项目编译目录(如
mvn clean),排除旧编译文件干扰
内容的提问来源于stack exchange,提问作者kniffte

