使用spring-boot-starter-parent 2.0.0时出现MongoSocketOpenException异常
我来帮你排查这个连接错误,MongoSocketOpenException本质上就是你的Spring Boot应用没法成功和MongoDB实例建立socket连接,结合你用的2.0.0.RELEASE版本,给你几个实用的排查方向:
先确认MongoDB服务是否在运行
如果是本地部署的MongoDB,先检查服务状态:- Windows:打开服务列表,找到MongoDB服务看是否处于启动状态
- Mac/Linux:终端执行
systemctl status mongod(systemd系统)或者直接运行mongod命令启动服务
同时可以用netstat -an | grep 27017(Linux/Mac)或者netstat -ano | findstr 27017(Windows)确认默认的27017端口是否在监听。
核对Spring Boot的MongoDB配置
Spring Boot 2.0.x默认会尝试连接localhost:27017,如果你的MongoDB不在本地、改了端口,或者需要指定数据库,一定要在配置文件里明确设置:
比如application.properties:spring.data.mongodb.host=你的MongoDB地址 spring.data.mongodb.port=你的端口号(默认27017) spring.data.mongodb.database=要连接的数据库名要是用的是MongoDB Atlas这类云服务,直接配置uri更方便:
spring.data.mongodb.uri=mongodb+srv://用户名:密码@集群地址/数据库名?retryWrites=true&w=majority检查防火墙和网络权限
- 本地环境:确认防火墙没有拦截27017端口,必要时临时关闭防火墙测试
- 远程MongoDB(比如云服务):要确保MongoDB实例的IP白名单包含你的应用所在IP,否则会被拒绝连接
验证依赖与MongoDB版本兼容性
Spring Boot 2.0.0.RELEASE对应的MongoDB驱动核心版本是3.6.3,这个版本和MongoDB 3.4、3.6、4.0版本都兼容,但如果你的MongoDB服务器是2.x或者5.x+,可能会出现兼容性问题,尽量让服务器版本和驱动版本不要差太远。直接测试MongoDB连接
先用MongoDB自带的客户端工具(比如mongo命令行或者MongoDB Compass)尝试连接目标MongoDB实例,如果工具都连不上,那问题出在MongoDB本身,先解决服务器的问题再回头看应用。
你的错误堆栈信息如下:
com.mongodb.MongoSocketOpenException: Exception opening socket
at com.mongodb.connection.SocketStream.open(SocketStream.java:62) ~[mongodb-driver-core-3.6.3.jar:na]
at com.mongodb.connection.InternalStreamConnection.open(InternalStreamConnection.java:126) ~[mongodb-driver-core-3.6.3.jar:na]
at com.mongod...
内容的提问来源于stack exchange,提问作者Prabhat

