Spring Boot MongoDB 连接问题

Posted

技术标签:

【中文标题】Spring Boot MongoDB 连接问题【英文标题】:Spring Boot MongoDB Connectivity Issue 【发布时间】:2021-03-15 10:35:09 【问题描述】:

我的 Spring Boot 应用程序正在尝试连接到 MongoDB 数据库。配置添加到 application.yml 文件中。直到昨天,该应用程序在本地运行良好。

但是今天我在本地主机上运行它时,我收到以下错误:

2020-12-03 14:59:03.763[0;39m [32m INFO[0;39m [35m10692[0;39m [2m---[0;39m [2m[ngodb.net:27017][0;39m [36morg.mongodb.driver.cluster              [0;39m [2m:[0;39m Exception in monitor thread while connecting to server edugyanamcluster-shard-00-00.l4au7.mongodb.net:27017

com.mongodb.MongoSocketWriteException: Exception sending message
    at com.mongodb.internal.connection.InternalStreamConnection.translateWriteException(InternalStreamConnection.java:551) ~[mongodb-driver-core-3.11.2.jar:na]
    at com.mongodb.internal.connection.InternalStreamConnection.sendMessage(InternalStreamConnection.java:433) ~[mongodb-driver-core-3.11.2.jar:na]
    at com.mongodb.internal.connection.InternalStreamConnection.sendCommandMessage(InternalStreamConnection.java:273) ~[mongodb-driver-core-3.11.2.jar:na]
    at com.mongodb.internal.connection.InternalStreamConnection.sendAndReceive(InternalStreamConnection.java:257) ~[mongodb-driver-core-3.11.2.jar:na]
    at com.mongodb.internal.connection.CommandHelper.sendAndReceive(CommandHelper.java:83) ~[mongodb-driver-core-3.11.2.jar:na]
    at com.mongodb.internal.connection.CommandHelper.executeCommand(CommandHelper.java:33) ~[mongodb-driver-core-3.11.2.jar:na]
    at com.mongodb.internal.connection.InternalStreamConnectionInitializer.initializeConnectionDescription(InternalStreamConnectionInitializer.java:105) ~[mongodb-driver-core-3.11.2.jar:na]
    at com.mongodb.internal.connection.InternalStreamConnectionInitializer.initialize(InternalStreamConnectionInitializer.java:62) ~[mongodb-driver-core-3.11.2.jar:na]
    at com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:129) ~[mongodb-driver-core-3.11.2.jar:na]
    at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:117) ~[mongodb-driver-core-3.11.2.jar:na]
    at java.base/java.lang.Thread.run(Thread.java:835) ~[na:na]
Caused by: javax.net.ssl.SSLHandshakeException: extension (5) should not be presented in certificate_request
    at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:131) ~[na:na]
    at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:117) ~[na:na]
    at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:307) ~[na:na]
    at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:263) ~[na:na]
    at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:254) ~[na:na]
    at java.base/sun.security.ssl.SSLExtensions.<init>(SSLExtensions.java:90) ~[na:na]
    at java.base/sun.security.ssl.CertificateRequest$T13CertificateRequestMessage.<init>(CertificateRequest.java:818) ~[na:na]
    at java.base/sun.security.ssl.CertificateRequest$T13CertificateRequestConsumer.consume(CertificateRequest.java:922) ~[na:na]
    at java.base/sun.security.ssl.SSLHandshake.consume(SSLHandshake.java:392) ~[na:na]
    at java.base/sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:443) ~[na:na]
    at java.base/sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:421) ~[na:na]
    at java.base/sun.security.ssl.TransportContext.dispatch(TransportContext.java:177) ~[na:na]
    at java.base/sun.security.ssl.SSLTransport.decode(SSLTransport.java:164) ~[na:na]
    at java.base/sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1180) ~[na:na]
    at java.base/sun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1091) ~[na:na]
    at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:402) ~[na:na]
    at java.base/sun.security.ssl.SSLSocketImpl.ensureNegotiated(SSLSocketImpl.java:721) ~[na:na]
    at java.base/sun.security.ssl.SSLSocketImpl$AppOutputStream.write(SSLSocketImpl.java:998) ~[na:na]
    at com.mongodb.internal.connection.SocketStream.write(SocketStream.java:99) ~[mongodb-driver-core-3.11.2.jar:na]
    at com.mongodb.internal.connection.InternalStreamConnection.sendMessage(InternalStreamConnection.java:430) ~[mongodb-driver-core-3.11.2.jar:na]
    ... 9 common frames omitted

[2m2020-12-03 14:59:05.112[0;39m [33m WARN[0;39m [35m10692[0;39m [2m---[0;39m [2m[  restartedMain][0;39m [36mJpaBaseConfiguration$JpaWebConfiguration[0;39m [2m:[0;39m spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning
[2m2020-12-03 14:59:07.468[0;39m [32m INFO[0;39m [35m10692[0;39m [2m---[0;39m [2m[  restartedMain][0;39m [36mpertySourcedRequestMappingHandlerMapping[0;39m [2m:[0;39m Mapped URL path [/v2/api-docs] onto method [springfox.documentation.swagger2.web.Swagger2ControllerWebMvc#getDocumentation(String, HttpServletRequest)]
[2m2020-12-03 14:59:07.822[0;39m [32m INFO[0;39m [35m10692[0;39m [2m---[0;39m [2m[  restartedMain][0;39m [36m.s.s.UserDetailsServiceAutoConfiguration[0;39m [2m:[0;39m

需要有关问题的建议吗?由于代码在几个小时前运行良好。

【问题讨论】:

我们今天开始看到完全相同的问题。你是阿特拉斯的吗? 是的,这个问题来自今天本身。 MongoDB 实际上已经更新了他们的服务器,可能已经更新了他们的密码。解决方案实际上是在 JVM 参数中将 TLS 版本更改为 1.2。您可以在 Eclipse -> Project -> Run As -> Run Configurations -> Arguments -> VM Arguments 中添加(添加 -> -Djdk.tls.client.protocols=TLSv1.2)。 【参考方案1】:

MongoDB 实际上已经更新了他们的服务器,可能已经更新了他们的密码。 解决方法其实就是在JVM params中将TLS Version改为1.2

可以在 Eclipse 中添加(如果将其用作 IDE)-> 项目 -> 运行方式 -> 运行配置 -> 参数 -> VM 参数,添加 ->

-Djdk.tls.client.protocols=TLSv1.2

【讨论】:

【参考方案2】:

我可以使用this other question 的解决方案来解决这个问题。我在 JVM 参数中将 TLS 版本更改为 1.2:

-Djdk.tls.client.protocols=TLSv1.2

【讨论】:

谢谢。我在哪里可以添加 JVM 参数?可以请指导吗? 如果您能说明如何将此选项添加到 Maven pom.xml,我将不胜感激! 只是一个执行参数:java -Djdk.tls.client.protocols=TLSv1.2 -jar app.jar 感谢您挽救了一场危机,您应该为此付出代价,想知道 Mongo 人根据自己的方便打破事情是多么容易 感谢您的解决方案,它有效。是否有任何关于导致此错误的原因以及我们何时必须使用此解决方法的信息?【参考方案3】:

除了降级到 TLSV1.2,升级 JDK 也可以解决这个问题。

对于 JDK 版本 11.0.0 - 11.0.6,将 JDK 升级到修补版本。 JDK-8236039

JDK 版本 13.0.0 - 13.0.02,升级到 13.0.03 应该可以解决此问题 JDK-8241515

【讨论】:

从 14.0.1 更新到 14.0.2 也对我有用 我正在运行 Amazon Corretto JDK 版本 11.0.9.1+12-LTS,但仍然看到此错误。 版本 15 显示相同的错误,但仅适用于我们的一些开发人员。非常令人沮丧。【参考方案4】:

我确实尝试了所有方法,例如升级 jdk,除了最好的解决方案之外的所有解决方案,而且可行的解决方案是更改 TLS 版本。

在IDE中右键项目 运行方式-> 运行配置... 并转到参数选项卡 并在 VM Arguments 添加这个 -Djdk.tls.client.protocols=TLSv1.2

现在运行应用程序,它应该可以正常工作。

您可以参考附加的图片以获得更清晰的信息。

enter image description here

enter image description here

【讨论】:

【参考方案5】:

我从 JDK 11.0.7 更新到 11.0.10,现在可以使用了

【讨论】:

【参考方案6】:

我遇到了同样的问题https://bugs.openjdk.java.net/browse/JDK-8236039,我将我的 JDK 更改为 JDK-15 zulu:https://www.azul.com/downloads/zulu-community/?version=java-15-mts,它解决了这个问题,我之前使用的是 Open JDK 版本。

【讨论】:

以上是关于Spring Boot MongoDB 连接问题的主要内容,如果未能解决你的问题,请参考以下文章

spring boot mongodb连接错误

Spring Boot配置MongoDB连接池

无法将 Spring Boot 与 MongoDb 连接

Spring boot连接MongoDB集群

Spring boot连接3.03以上的mongodb 权限验证问题

我们可以用spring boot连接多个mongoDB数据源吗