Spring Boot多数据源配置下无法扫描识别JPA Repository问题
问题根因
出现Found 0 JPA repository interfaces的核心原因有3个,按影响优先级排序:
- 主启动类包扫描范围遗漏配置类
@SpringBootApplication注解默认只扫描主启动类所在包及其子包下的组件,你的主启动类在com.te.initializer包下,而两个数据源配置类存放在com.te.configuration包,不在默认扫描范围内,因此标注在配置类上的@EnableJpaRepositories注解根本没有被Spring解析加载,自定义的多数据源Repository扫描规则完全没生效。Spring只会用默认规则扫描主启动类所在包下的Repository,自然找不到任何接口。 - EntityManager实体扫描路径配置错误
LocalContainerEntityManagerFactoryBean的setPackagesToScan方法作用是扫描标注了@Entity的JPA实体类,你当前配置的是Repository所在的包路径,就算配置类被正常加载,后续也会报实体未映射的错误。 - 配置缺失导致潜在空指针
你的配置类中显式读取hibernate.hbm2ddl.auto、hibernate.dialect两个配置项,但application-dev.properties中这两个配置被注释,EntityManager初始化时会因为取到null值抛出异常。
另外还存在一个隐性风险:@Primary注解只能标注在同一个类型的多个Bean中的一个上,你需要确认masterdata数据源对应的DataSource、EntityManagerFactory、PlatformTransactionManager三个Bean没有加@Primary,否则启动时会报Bean重复冲突。
修复步骤
- 调整主启动类扫描范围:最推荐的做法是把主启动类移动到
com.te根包下,符合Spring Boot官方推荐的目录结构,无需额外配置就能扫描所有子包的组件。如果不想移动类,就在注解上显式声明扫描根包:
package com.te.initializer; @SpringBootApplication(scanBasePackages = "com.te") public class WWWAbacusApplication { public static void main(String[] args) { SpringApplication.run(WWWAbacusApplication.class, args); } }
- 修正实体扫描路径:把两个数据源配置类中
setPackagesToScan的参数替换为对应数据源的实体类所在包路径,例如www数据源的实体存放在com.te.entity.www,就修改为:
em.setPackagesToScan(new String[] { "com.te.entity.www" });
注意:@EnableJpaRepositories注解上的basePackages是扫描Repository接口的路径,你之前的配置是正确的,无需修改
- 补全Hibernate配置:在
application-dev.properties中添加Oracle数据库对应的Hibernate参数:
hibernate.hbm2ddl.auto=none hibernate.dialect=org.hibernate.dialect.Oracle12cDialect
- 校验Profile配置:确认启动时已激活dev环境,否则标注了
@Profile("dev")的配置类不会被加载,可以通过启动参数--spring.profiles.active=dev或者配置文件中添加spring.profiles.active=dev指定。
验证方法
重启项目后观察日志,Repository扫描阶段会分别输出两个数据源包路径下扫描到的Repository接口数量,不再出现0个接口的提示即为修复成功。
内容的提问来源于stack exchange,提问作者fatherazrael
相关产品推荐
相关产品推荐

