Java Spring / MongoDb 仅在使用 URI 字段时才能正常工作。

4

我有一个非常奇怪的情况。 我正在运行一个连接到MongoDb实例的Java spring-boot应用程序。 当我使用

spring.data.mongodb.uri=mongodb://{username}:{password}@{host}

字段时,我可以成功连接。 但是当我使用:

spring.data.mongodb.host={host}
spring.data.mongodb.username={username}
spring.data.mongodb.password={password}

我遇到了身份验证失败的问题,是什么原因呢?当然,括号中的值完全相同。
我在两个设置中都包含了这些内容:
spring.data.mongodb.authentication-database={auth-db}
spring.data.mongodb.database={mydb}

其他细节

非uri方法在一个环境中可行,但在我尝试修复的另一个环境中不起作用。

将两个服务器都运行在同一个Docker Swarm中

Mongo副本集版本4.0.4

Java 8


你尝试过在 spring.data.mongodb.port= 中分离主机和端口吗?从文档中可以看出,主机和端口都是必需的:https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-nosql.html#boot-features-connecting-to-mongodb - Vlad Topala
你是对的,它说如果未指定spring.data.mongodb.port,则使用默认的27017端口。我最初漏掉了这一部分。 - Vlad Topala
用户或密码的URL形式是否包含任何%或+字符? - Kenster
不对!用户名和密码只是数字和字母。主机名包含一个“.”。 - Sedky A
你能添加完整的URI吗?你的属性文件包括认证数据库和应用程序数据库吗?你使用什么身份验证机制?你能创建一个GitHub项目吗? - s7vr
显示剩余3条评论
3个回答

2

看起来这已经不再支持了。 引用自docs.spring.io - 31.2.1 连接到 MongoDB 数据库

如果您使用的是 Mongo 3.0 Java 驱动程序,则不支持 spring.data.mongodb.hostspring.data.mongodb.port。 在这种情况下,应该使用 spring.data.mongodb.uri 来提供所有配置。


文档有误。在我的低级环境中,我可以使用.host和.port约定轻松连接。但是在我的高级环境中(设置相同,使用完全相同的Docker镜像),无法正常工作。 - Sedky A
@SedkyA,看起来你的数据库在“高级环境”中无法访问。 - Fabio Manzano
@SedkyA,您能详细说明什么是更高的环境吗? - fhery021
这实际上是Swarm中具有更多节点的环境。这并不重要,它只意味着它是另一个具有完全相同架构的环境。其中一个我可以使用主机/用户/密码连接,另一个我必须使用URI连接。 - Sedky A

0

我不能评论,只能回答。

尝试添加你的数据库名称?希望可以解决问题。 spring.data.mongodb.database=


我已经尝试过了,但没有成功。请注意,我还没有将其添加到URI中,但我仍然可以连接。 - Sedky A
如果我离开数据库,我会遇到身份验证失败的问题。但是我有多个数据库。 - ville
有道理。我已经尝试过设置数据库和认证数据库。仍然出现身份验证失败。 - Sedky A
你是否已经阅读了 https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-nosql.html 。31.2.1 连接到 MongoDB 数据库。 - ville

0

试试这个

spring.data.mongodb.host={host}
spring.data.mongodb.port={port}
spring.data.mongodb.username={username}
spring.data.mongodb.password={password}
spring.data.mongodb.database={database}

这对我来说是有效的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接