Spring MVC连接AWS DocumentDB失败求助(原EC2 MongoDB正常)
我之前帮团队处理过类似MongoDB迁移到DocumentDB的连接问题,结合你的技术栈版本,核心问题应该是没适配DocumentDB的强制SSL要求和认证机制,给你整理了针对性的解决方案:
解决DocumentDB连接问题的关键调整
1. 强制开启SSL连接
AWS DocumentDB默认要求所有连接使用SSL加密,你的原有代码完全没配置SSL选项,这是连接失败的核心原因之一。需要通过MongoClientOptions开启SSL:
@Bean public MongoDbFactory mongoDbFactory() throws UnknownHostException { // 配置SSL连接选项 MongoClientOptions options = MongoClientOptions.builder() .sslEnabled(true) .sslInvalidHostNameAllowed(true) // 若遇到主机名与证书不匹配的问题可开启,AWS官方证书通常无需此配置 .build(); // 构建带SSL的MongoClient MongoClient mongoClient = new MongoClient( new ServerAddress(env.getProperty("mongo.database.host"), Integer.parseInt(env.getProperty("mongo.database.port"))), options ); return new SimpleMongoDbFactory(mongoClient, env.getProperty("mongo.database.name")); }
2. 添加DocumentDB认证信息
DocumentDB必须通过用户名密码认证访问,你的原有代码缺少认证配置,需要补充MongoCredential:
import java.util.Arrays; import com.mongodb.MongoCredential; @Bean public MongoDbFactory mongoDbFactory() throws UnknownHostException { // 从配置文件读取认证信息 String username = env.getProperty("mongo.database.username"); String password = env.getProperty("mongo.database.password"); String dbName = env.getProperty("mongo.database.name"); // 创建认证凭证 MongoCredential credential = MongoCredential.createCredential( username, dbName, password.toCharArray() ); // 配置SSL选项 MongoClientOptions options = MongoClientOptions.builder() .sslEnabled(true) .build(); // 构建带认证和SSL的MongoClient MongoClient mongoClient = new MongoClient( new ServerAddress(env.getProperty("mongo.database.host"), Integer.parseInt(env.getProperty("mongo.database.port"))), Arrays.asList(credential), options ); return new SimpleMongoDbFactory(mongoClient, dbName); }
3. 确认版本兼容性
你的技术栈版本是兼容的:Spring Data MongoDB 1.10.14对应的Mongo Java Driver支持范围是3.2.x~3.6.x,你用的3.5.0正好在这个区间内,不需要调整版本,只要确保依赖没有冲突即可。
额外排查点
- 检查EC2实例与DocumentDB是否在同一VPC,且安全组配置允许EC2访问DocumentDB的27017端口;
- 若遇到证书信任问题,可下载AWS官方的DocumentDB证书导入JVM信任存储,或在代码中指定证书路径:
System.setProperty("javax.net.ssl.trustStore", "/path/to/rds-combined-ca-bundle.pem"); System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
(通常默认JVM信任存储已包含AWS根证书,此步骤大概率不需要)
内容的提问来源于stack exchange,提问作者Mansi Joshi




