Spring Data未扫描MongoDB仓库,如何恢复扫描功能?
我有一个演示多种实践的Demo应用,原本可同时向MySQL和MongoDB插入数据,之前启动日志会显示:
Bootstrapping Spring Data JPA repositories in DEFAULT mode.
Bootstrapping Spring Data MongoDb repositories in DEFAULT mode.
但添加H2内存数据库等修改后,日志仅保留JPA仓库的启动信息,MongoDB仓库未被扫描,且抛出Bean不存在异常:
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'fr.tristan.demoassurance.infrastructure.repository.mongodb.PoliceAssuranceSpringDataMongoOrderRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
当前配置与依赖
application.properties
spring.jpa.open-in-view=false spring.data.mongodb.authentication-database=admin spring.data.mongodb.host=localhost spring.data.mongodb.port=27017 spring.data.mongodb.database=police-assurance-database spring.jpa.properties.hibernate.globally_quoted_identifiers=true
MongoDB配置类
package fr.tristan.demoassurance.infrastructure.repository.mongodb.config; import org.springframework.data.mongodb.repository.config.EnableMongoRepositories; import fr.tristan.demoassurance.infrastructure.repository.mongodb.PoliceAssuranceSpringDataMongoOrderRepository; @EnableMongoRepositories(basePackageClasses = PoliceAssuranceSpringDataMongoOrderRepository.class) public class MongoDBConfiguration { }
MongoDB仓库接口
package fr.tristan.demoassurance.infrastructure.repository.mongodb; import java.util.List; import org.springframework.data.mongodb.repository.MongoRepository; import fr.tristan.demoassurance.infrastructure.repository.mongodb.entity.PoliceAssuranceMongo; public interface PoliceAssuranceSpringDataMongoOrderRepository extends MongoRepository<PoliceAssuranceMongo, Integer> { List<PoliceAssuranceMongo> findByNom(String nom); }
项目依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> </dependency>
修复步骤
1. 确保MongoDB配置类被Spring扫描
给MongoDBConfiguration添加@Configuration注解,让Spring识别这是一个配置类:
package fr.tristan.demoassurance.infrastructure.repository.mongodb.config; import org.springframework.context.annotation.Configuration; import org.springframework.data.mongodb.repository.config.EnableMongoRepositories; import fr.tristan.demoassurance.infrastructure.repository.mongodb.PoliceAssuranceSpringDataMongoOrderRepository; @Configuration @EnableMongoRepositories(basePackageClasses = PoliceAssuranceSpringDataMongoOrderRepository.class) public class MongoDBConfiguration { }
如果配置类所在包不在主类的默认扫描范围内,还需在主类通过@ComponentScan指定该包路径。
2. 排查H2依赖导致的自动配置冲突
添加H2后,若Spring Boot自动配置出现优先级问题,可在application.properties中明确保留MongoDB自动配置:
# 若不需要自动配置默认数据源,可排除DataSourceAutoConfiguration spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration # 启用MongoDB自动索引创建,确保配置生效 spring.data.mongodb.auto-index-creation=true
3. 验证MongoDB服务状态
确认本地MongoDB服务正在运行,端口27017可正常访问,认证信息与application.properties一致。若MongoDB未启动,Spring会跳过MongoDB仓库初始化。可开启DEBUG日志查看连接详情:
logging.level.org.springframework.data.mongodb=DEBUG
4. 调整主类注解
若主类使用@SpringBootApplication但额外指定了JPA仓库扫描,需同时明确MongoDB仓库的扫描范围:
@SpringBootApplication @EnableMongoRepositories(basePackages = "fr.tristan.demoassurance.infrastructure.repository.mongodb") @EnableJpaRepositories(basePackages = "fr.tristan.demoassurance.infrastructure.repository.jpa") // 替换为实际JPA仓库包路径 public class DemoAssuranceApplication { public static void main(String[] args) { SpringApplication.run(DemoAssuranceApplication.class, args); } }
内容的提问来源于stack exchange,提问作者Tristan

