【发布时间】:2021-10-26 16:43:17
【问题描述】:
我有一个使用 Spring Boot 处理后端逻辑的 Web 应用程序。我正在尝试集成 mongodb 以跟踪有关此 webapp 用户的一些信息。 我在 mongodb Atlas 上创建了一个数据库,并通过 Mongo Shell 连接正常。当我尝试与 Spring 连接时,问题就来了。让我告诉你所有的细节
在 Atlas 中,我将此 IP 地址(0.0.0.0/0(包括您当前的 IP 地址))添加到安全 > 网络地址中。理论上,这应该允许我从任何 IP 地址连接到数据库。
然后我创建了一个名为“test”的集合。
如果我单击我的集群,然后单击连接按钮,它会询问我要使用哪种方式连接。我选择“连接您的应用程序”,然后我必须选择驱动程序和版本。我分别选择“Java”和“3.6 或更高版本”(我不确定它是否是正确的版本,替代品是 3.4 或 3.3)。最后它向我显示了连接字符串:
mongodb+srv://admin:<password>@umadit-obxpb.mongodb.net/test?retryWrites=true&w=majority
要使用 Spring 连接到 Atlas,我正在使用此依赖项
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
</dependency>
在 application.properties 文件中,我有这两行来配置 mongo。
spring.data.mongodb.host=mongodb+srv://admin:<password>@umadit-obxpb.mongodb.net/test?retryWrites=true&w=majority
spring.data.mongodb.port=27017
出于显而易见的原因,而不是我输入的密码。
唯一的问题是,当我启动 Spring Boot 时,我继续收到此错误消息:
2020-02-25 16:31:25.605 INFO 41162 --- [=majority:27017] org.mongodb.driver.cluster : Exception in monitor thread while connecting to server mongodb+srv://admin:<password>@umadit-obxpb.mongodb.net/test?retrywrites=true&w=majority:27017
com.mongodb.MongoSocketException: mongodb+srv://admin:<password>@umadit-obxpb.mongodb.net/test?retrywrites=true&w=majority: nodename nor servname provided, or not known
at com.mongodb.ServerAddress.getSocketAddress(ServerAddress.java:188) ~[mongo-java-driver-3.6.4.jar:na]
at com.mongodb.connection.SocketStreamHelper.initialize(SocketStreamHelper.java:59) ~[mongo-java-driver-3.6.4.jar:na]
at com.mongodb.connection.SocketStream.open(SocketStream.java:57) ~[mongo-java-driver-3.6.4.jar:na]
at com.mongodb.connection.InternalStreamConnection.open(InternalStreamConnection.java:126) ~[mongo-java-driver-3.6.4.jar:na]
at com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:114) ~[mongo-java-driver-3.6.4.jar:na]
at java.lang.Thread.run(Thread.java:745) [na:1.8.0_111]
Caused by: java.net.UnknownHostException: mongodb+srv://admin:<password>@umadit-obxpb.mongodb.net/test?retrywrites=true&w=majority: nodename nor servname provided, or not known
at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method) ~[na:1.8.0_111]
at java.net.InetAddress$2.lookupAllHostAddr(InetAddress.java:928) ~[na:1.8.0_111]
at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1323) ~[na:1.8.0_111]
at java.net.InetAddress.getAllByName0(InetAddress.java:1276) ~[na:1.8.0_111]
at java.net.InetAddress.getAllByName(InetAddress.java:1192) ~[na:1.8.0_111]
at java.net.InetAddress.getAllByName(InetAddress.java:1126) ~[na:1.8.0_111]
at java.net.InetAddress.getByName(InetAddress.java:1076) ~[na:1.8.0_111]
at com.mongodb.ServerAddress.getSocketAddress(ServerAddress.java:186) ~[mongo-java-driver-3.6.4.jar:na]
... 5 common frames omitted
我不知道该怎么做才能让它发挥作用。我错过了什么吗?
解决方案
正如@barrypicker 所建议的,问题出在属性文件中。我没有使用 spring.data.mongodb.host,而是使用了 spring.data.mongodb.uri。现在它完美地工作了。
spring.data.mongodb.uri=mongodb+srv://admin:<password>@umadit-obxpb.mongodb.net/test?retryWrites=true&w=majority
即使没有 spring.data.mongodb.port
【问题讨论】:
-
这个错误表明主机名未知。您是否在运行此 spring 应用程序的同一台计算机上运行了 mongo shell 测试?表面上看起来像是 DNS 问题...
-
@barrypicker 是的,我做到了!
-
不完全确定 - 我找不到文档,但不是
spring.data.mongodb.host尝试spring.data.mongodb.uri -
...我认为您还需要在 URI 中使用端口号...
-
谢谢@barrypicker!它与 spring.data.mongodb.uri 一起使用!试图检查这是否是一个更复杂的问题,我什至没有考虑过!
标签: mongodb spring-boot mongodb-atlas