You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Data未扫描MongoDB仓库,如何恢复扫描功能?

恢复Spring Boot中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 15:55:09