6

我是使用 Spring Boot 的 Mongodb 新手。我有 MONGODB ATLAS U​​RI 连接字符串

mongodb://userName:<PASSWORD>@icarat-shard-00-00-7lopx.mongodb.net:27017,icarat-shard-00-01-7lopx.mongodb.net:27017,icarat-shard-00-02-7lopx.mongodb.net:27017/<DATABASE>?ssl=true&replicaSet=icarat-shard-0&authSource=admin

然后在我的 Spring Boot 应用程序中,我在 application.properties 中设置 uri,例如

spring.data.mongodb.uri: mongodb://userName:*****@icarat-shard-00-00-7lopx.mongodb.net:27017,icarat-shard-00-01-7lopx.mongodb.net:27017,icarat-shard-00-02-7lopx.mongodb.net:27017/vehicleplatform?ssl=true&replicaSet=icarat-shard-0&authSource=admin

此存储库接口

public interface OrganizationRepository extends   MongoRepository<Organization, String> {   

}

当我注入 OrganizationRepository 接口时,它显示这样的错误

无法实例化 [com.mongodb.MongoClient]:工厂方法 'mongo' 抛出异常;嵌套异常是 java.lang.IllegalArgumentException:连接字符串包含无效的用户信息。如果用户名或密码包含冒号 (:) 或符号 (@),则必须进行 urlencoded

这是我的文档类

@Document(collection="Organization")
public class Organization {

    @Id
    String id;

    String orgName; 

    String orgAddress;

    String pinCode;

//getter 

//setter
}

这是我的 pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.icarat</groupId>
  <artifactId>vehicleplatform</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>vehicleplatform</name>
  <url>http://maven.apache.org</url>


    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <java.version>1.8</java.version>
  </properties>

  <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- mongodb java driver -->
        <dependency>
            <groupId>org.mongodb</groupId>
            <artifactId>mongo-java-driver</artifactId>
            <version>2.11.0</version>
        </dependency>

        <!-- swagger2 dependency -->

        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId> springfox-swagger2</artifactId>
            <version>2.6.1</version>
        </dependency>

        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.6.1</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

我们如何解决这个问题?谢谢

4

5 回答 5

5

我发现了实际的问题。在我以前的 Atlas 密码中包含 @(符号),所以它不支持。我在这里关注了文件

重要 如果密码包含保留的 URI 字符,则必须根据 RFC 2396 对字符进行转义。例如,如果您的密码是 @bc123,则在连接字符串中指定密码时必须对 @ 字符进行转义;即%40bc123。

于 2017-03-27T05:56:29.920 回答
4

无法实例化 [com.mongodb.MongoClient]:工厂方法 'mongo' 抛出异常;嵌套异常是 java.lang.IllegalArgumentException:连接字符串包含无效的用户信息。如果用户名或密码包含冒号 (:) 或符号 (@),则必须进行 urlencoded

问题很清楚,如果您尝试使用 SpringBoot 连接 MongoDB Atlas,您的密码必须是 URL 编码的,这样更安全。

在这里,您可以看到如何在 MongoDB Atlas 中对密码进行 URL 编码。

于 2017-11-26T10:51:18.117 回答
3

您可以使用 Mongodb SRV 记录来定义与集群关联的所有节点

  # Mongo Connection
  spring.data.mongodb.uri=mongodb+srv://myuser:mypassword@mycluster.azure.mongodb.net/mydb?retryWrites=true&w=majority

在哪里

  • myuser:MongoDB用户
  • mypassword:上面用户的密码
  • mycluster.azure.mongodb.net:集群的主机
  • mydb:应用程序的 Mongodb 数据库

使用 Atlas 分配给您的正确 SRV 非常重要(在您的示例中,您已经组合了所有三个分片),您可以在“连接您的应用程序”屏幕中获得它以及代码示例(如果需要)。

复制连接字符串,替换密码和数据库名,在 SpringBoot 属性文件中设置。

于 2020-06-15T07:29:17.490 回答
1

我认为最好的逃避是遵循这种模式:

spring.data.mongodb.authentication-database=#认证数据库名称。spring.data.mongodb.database=db_name。spring.data.mongodb.host=127.0.0.1 spring.data.mongodb.password=passwrd spring.data.mongodb.port=27017 spring.data.mongodb.repositories.enabled=true #启用Mongo存储库。spring.data.mongodb.username= # mongo服务器的登录用户。

于 2020-06-09T14:36:18.640 回答
0

在我的情况下,我添加了 {},并被 documentDb url 包围

于 2022-01-12T18:40:11.650 回答