Spring Boot 项目启动报错:MongoSocketOpenException 连接被拒绝排查日记
1. 背景及环境说明
因为业务需求,引入了一个轻量级的数据库备份组件,组件支持MySQL、MongoDB等数据源的自动数据库备份,而我只需要对MySQL数据库的数据源进行备份,当前我的项目是并没有使用MongoDB的。
引入后启动Spring Boot 项目时,控制台突然出现如下异常:
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,但如果你发现你的项目中是用到的,那就按照下面的排查步骤找一下问题。
① 服务端已启动并监听正确端口:
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
配置文件中禁用自动配置:
spring:autoconfigure:exclude: - org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration- org.springframework.boot.autoconfigure.mongo.MongoDataAutoConfiguration
或在主启动类上加注解排除配置类:
@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 = …)
禁用。