Spring Boot 启动报 MongoSocketOpenException:Connection refused 问题解决(无 MongoDB 配置也报错)

89次阅读
没有评论

本文详细解决 Spring Boot 项目未配置 MongoDB 却启动报 com.mongodb.MongoSocketOpenException: Connection refused 问题,分析 mongodb-driver-sync 依赖触发自动装配原因,提供禁用 MongoAutoConfiguration 的两种方案,助开发者快速排查类似异常。

一、背景及环境说明​

因业务需求,项目引入一款轻量级数据库备份组件(支持 MySQL、MongoDB 等数据源自动备份),但实际仅需备份 MySQL 数据库,且项目本身未使用 MongoDB。​

然而,引入该组件后启动 Spring Boot 项目,控制台突然抛出如下异常,导致应用启动失败:​

​com.mongodb.MongoSocketOpenException: Exception opening socket​

Caused by: java.net.ConnectException: Connection refused: connect​​

令人疑惑的是,项目中未配置任何 MongoDB 连接信息,也无使用 MongoDB 的计划,却出现此连接异常。​

二、排查思路​

遇到“Connection refused”异常,直观判断为“客户端连接数据库失败”,按以下步骤逐步排查:​

2.1 确认当前项目是否使用 MongoDB​

首先怀疑项目中是否有其他人添加了 MongoDB 相关使用(自己未察觉),通过检查 pom.xml 文件,确认是否引入 spring-boot-starter-data-mongodb 等 MongoDB 相关依赖,最终未发现此类依赖。​

2.2 确认 MongoDB 服务是否在运行​

由于本项目明确无需 MongoDB,未执行此步骤,但若你的项目实际需使用 MongoDB,可按以下流程排查:​

① 检查服务端是否启动并监听正确端口:​

# 查看 MongoDB 进程​

ps -ef | grep mongod​

# 检查 27017 端口监听情况(MongoDB 默认端口)​

netstat -ano | findstr 27017​​

② 验证连接地址:Spring Boot 在未配置 MongoDB 连接地址时,默认使用 mongodb://localhost:27017,若 MongoDB 服务端不在本地,会出现连接拒绝。​

③ 排查防火墙:若 MongoDB 部署在远程服务器,需在服务器端开放 27017 端口,并在 mongod.conf 配置中允许外部访问。​

2.3 排查结果​

① 项目未配置任何 MongoDB 连接信息;​

② pom.xml 未引入 spring-boot-starter-data-mongodb 依赖。​

三、解决方案​

3.1 定位问题根源​

通过 IDEA 的 Maven Helper 等插件分析项目依赖,发现新引入的 tworice-backup-starter 依赖中,关联依赖了 mongodb-driver-sync(该依赖用于支持 MongoDB 数据库备份)。​

Spring Boot 启动报 MongoSocketOpenException:Connection refused 问题解决(无 MongoDB 配置也报错)

Spring Boot 自动装配遵循“类路径条件 + 配置属性”原则,只要满足以下两个条件,就会加载 MongoAutoConfiguration:​

① 类路径存在 com.mongodb.client.MongoClient 类(本项目中由 mongodb-driver-sync 依赖提供);​

② Spring Data MongoDB 自动配置类可被 spring-boot-autoconfigure 的 MongoAutoConfiguration 自动扫描。​

这意味着,无需显式引入 spring-boot-starter-data-mongodb,只要类路径存在 mongodb-driver-sync 依赖,Spring Boot 就会默认认为需要使用 MongoDB,并执行以下操作:​

  • 创建 MongoClient Bean;​
  • 若本地无 MongoDB 服务,启动阶段就会抛出 MongoSocketOpenException。​

3.2 解决问题(禁用 MongoDB 自动配置)​

若仅需保留 MongoClient 相关类,无需 Spring Boot 自动创建 MongoDB 连接,可通过以下两种方式禁用自动配置:​

方式一:在 application.yml 配置文件中添加排除配置​

spring:​

autoconfigure:​

exclude: ​

- org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration​

- org.springframework.boot.autoconfigure.mongo.MongoDataAutoConfiguration​​

方式二:在项目主启动类上通过注解排除配置类​

​import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;​

import org.springframework.boot.autoconfigure.mongo.MongoDataAutoConfiguration;​

import org.springframework.boot.SpringApplication;​

import org.springframework.boot.autoconfigure.SpringBootApplication;​

​

@SpringBootApplication(​

exclude = {​

MongoAutoConfiguration.class,​

MongoDataAutoConfiguration.class​

}​

)​

public class Application {​

public static void main(String[] args) {​

SpringApplication.run(Application.class, args);​

}​

}​​

四、总结​

4.1 问题症状​

仅引入 mongodb-driver-sync 依赖,未配置 MongoDB 相关信息,Spring Boot 启动时仍会自动连接 MongoDB,若本地未启动 MongoDB 服务,就会报“Connection refused”异常。​

4.2 根本原因​

Spring Boot 自动装配机制中,只要检测到类路径存在 com.mongodb.client.MongoClient 类(由 mongodb-driver-sync 依赖提供),就会触发 MongoAutoConfiguration 自动配置。​

4.3 核心解决方法​

无需 MongoDB 自动配置时,通过 spring.autoconfigure.exclude 配置或 @SpringBootApplication(exclude = …) 注解,排除 MongoAutoConfiguration 和 MongoDataAutoConfiguration 即可。

正文完
 0
Pa2sw0rd
版权声明:本文于2025-09-15转载自CSDN,共计2826字。
转载提示:此文章非本站原创文章,若需转载请联系原作者获得转载授权。
评论(没有评论)