Spring Boot 项目启动报错:MongoSocketOpenException 连接被拒绝排查日记

1. 背景及环境说明

因为业务需求,引入了一个轻量级的数据库备份组件,组件支持MySQL、MongoDB等数据源的自动数据库备份,而我只需要对MySQL数据库的数据源进行备份,当前我的项目是并没有使用MongoDB的。

引入后启动Spring Boot 项目时,控制台突然出现如下异常:

perl 复制代码
com.mongodb.MongoSocketOpenException: Exception opening socket
Caused by: java.net.ConnectException: Connection refused: connect

令人疑惑的是,项目中并没有配置任何 MongoDB 连接信息,甚至并没有打算使用 MongoDB,但应用启动还是失败了。

2. 排查思路

遇到 Connection refused,直觉是"客户端连接数据库失败",于是按照以下步骤排查:

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

先是怀疑了一下我当前跑的这个项目是否其他人加入了MongoDB的使用,只是自己不知情。

检查了 pom.xml 中是否引入 spring-boot-starter-data-mongodb 之类的依赖,但并没有发现。

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

这一步我并没有进行,因为我的项目很确定不需要MongoDB,但如果你发现你的项目中是用到的,那就按照下面的排查步骤找一下问题。

① 服务端已启动并监听正确端口:

perl 复制代码
ps -ef | grep mongod
netstat -ano | findstr 27017

② 检查连接地址

Spring Boot 在没有配置时会默认使用 mongodb://localhost:27017。如果服务端不在本地连接会被拒绝。

③ 排查防火墙

如果 MongoDB 部署在远程服务器,在服务器端需要将开放 27017 端口,并在 mongod.conf 中允许外部访问。

2.3. 排查结果

① 项目中没有配置任何MongoDB连接;

② pom.xml也没有引入spring-boot-starter-data-mongodb。

3. 解决方案

3.1. 找到问题

使用IDEA中Maven Helper等插件,查看自己引入的依赖中是否关联依赖了MongoDB的相关依赖。

根据排查确实在刚用到的tworice-backup-starter依赖中依赖了mongodb-driver-sync,该依赖是为了支持能够从MongoDB数据库中读取并备份数据。

Spring Boot 的自动装配遵循"类路径条件 + 配置属性"原则。

只要以下两个条件满足,就会加载 MongoAutoConfiguration:

① 类路径上存在 com.mongodb.client.MongoClient,而在我的项目中这一类由官方驱动 mongodb-driver-sync 提供。

② Spring Data MongoDB 自动配置类可用

spring-boot-autoconfigure的MongoAutoConfiguration会自动扫描。

也就是说,并不需要显式依赖 spring-boot-starter-data-mongodb,只要引入了官方驱动,Spring Boot 仍然认为你要用 MongoDB,并且会:

创建 MongoClient Bean

默认连接 mongodb://localhost:27017

如果本地没有 MongoDB 服务,启动阶段就抛出 MongoSocketOpenException

3.2. 解决问题

我这里只是想使用MongoClient相关类,但不希望Spring Boot自动创建连接,所以在application.yml配置文件中禁用自动配置:

yaml 复制代码
spring:
  autoconfigure:
    exclude: 
      - org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration
      - org.springframework.boot.autoconfigure.mongo.MongoDataAutoConfiguration

或在主启动类上加注解排除配置类:

ruby 复制代码
@SpringBootApplication(
    exclude = {
        MongoAutoConfiguration.class,
        MongoDataAutoConfiguration.class
    }
)
public class Application { ... }

4. 总结

症状 :仅引入mongodb-driver-sync依赖也会在Spring Boot启动时自动连接MongoDB,若未启动数据库则报 Connection refused。

原因 :Spring Boot自动装配只要检测到类路径存在 com.mongodb.client.MongoClient,就触发 MongoAutoConfiguration。

解决 :不需要自动配置时,使用 spring.autoconfigure.exclude 或 @SpringBootApplication(exclude = ...) 禁用。

相关推荐
子兮曰3 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰3 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
爱勇宝3 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
胡写代码3 天前
别再前后端各写一套表单校验了
java·后端
大勇前进3 天前
原生 PHP 还是 Laravel?小项目到底要不要上框架
后端
yuzhi_liu3 天前
我用 LangGraph4j 实现 Multi-Agent Supervisor
后端
alsmile3 天前
Node-RED 之外,国产规则引擎的新方案:基于标准语法,Go 先行实现
后端·开源·go
大白803 天前
PHP 内存溢出排查思路:看懂报错日志,精准定位问题
后端
二月龙3 天前
PHP 接口返回统一响应封装,让前后端对接更省心
后端
盖伦发发3 天前
软件工程SOLID 五大设计原则
后端·软件工程