【问题标题】:Spring Boot and how to configure connection details to MongoDB?Spring Boot 以及如何配置与 MongoDB 的连接详细信息?
【发布时间】:2014-06-24 06:46:52
【问题描述】:

作为 Spring Boot 新手,我想知道如何为 MongoDB 配置连接详细信息。 我已经尝试了正常的例子,但没有一个涵盖连接细节。

我想指定将要使用的数据库以及运行 MongoDB 的主机的 url/端口。

任何提示或提示?

【问题讨论】:

    标签: spring mongodb spring-data spring-boot


    【解决方案1】:

    引用Boot Docs:

    您可以设置spring.data.mongodb.uri 属性来更改网址,或者指定host/port。例如,您可以在 application.properties 中声明以下内容:

    spring.data.mongodb.host=mongoserver
    spring.data.mongodb.port=27017
    

    spring.data.mongodb 前缀的所有可用选项都是 MongoProperties 的字段:

    private String host;
    
    private int port = DBPort.PORT;
    
    private String uri = "mongodb://localhost/test";
    
    private String database;
    
    private String gridFsDatabase;
    
    private String username;
    
    private char[] password;
    

    【讨论】:

    【解决方案2】:
    如果您使用的是 Mongo 3.0 Java 驱动程序,则不支持

    spring.data.mongodb.hostspring.data.mongodb.port。在这种情况下,应该使用spring.data.mongodb.uri 来提供所有配置,如下所示:

    spring.data.mongodb.uri=mongodb://user:secret@mongo1.example.com:12345
    

    【讨论】:

    • 如果您没有用户或密码怎么办?
    • @Jesse 在这种情况下很好,默认情况下 mongo 不需要任何身份验证,因此在这种情况下连接可以正常工作。
    • spring.data.mongodb.uri 中是否有提供自动重新连接的选项?
    • 它是否适用于独立的 Spring Data 应用程序?
    • 属性文件中的秘密是可疑的。直接进入未加密的 VCS。
    【解决方案3】:

    还需要注意的是,MongoDB 具有“身份验证数据库”的概念,它可能与您要连接的数据库不同。例如,如果您使用 official Docker image for Mongo 并指定环境变量 MONGO_INITDB_ROOT_USERNAMEMONGO_INITDB_ROOT_PASSWORD,则会在“admin”数据库中创建一个用户,这可能不是您要使用的数据库。在这种情况下,您应该在 application.properties 文件上相应地指定参数,使用:

    spring.data.mongodb.host=127.0.0.1
    spring.data.mongodb.port=27017
    spring.data.mongodb.authentication-database=admin
    spring.data.mongodb.username=<username specified on MONGO_INITDB_ROOT_USERNAME>
    spring.data.mongodb.password=<password specified on MONGO_INITDB_ROOT_PASSWORD>
    spring.data.mongodb.database=<the db you want to use>
    

    【讨论】:

    • 如果是password,则不是MONGO_INITDB_ROOT_USERNAME,而是MONGO_INITDB_ROOT_PASSWORD
    • 你和这个人一起救了我。谢谢
    【解决方案4】:

    在一个 maven 项目中创建一个文件src/main/resources/application.yml,其内容如下:

    spring.profiles: integration
    # use local or embedded mongodb at localhost:27017
    ---
    spring.profiles: production
    spring.data.mongodb.uri: mongodb://<user>:<passwd>@<host>:<port>/<dbname>
    

    Spring Boot 会自动使用这个文件来配置你的应用程序。然后,您可以使用集成配置文件(并使用本地 MongoDB)启动您的 Spring Boot 应用程序

    java -jar -Dspring.profiles.active=integration your-app.jar
    

    或使用生产配置文件(并使用您的生产 MongoDB)

    java -jar -Dspring.profiles.active=production your-app.jar
    

    【讨论】:

    • spring.data.mongodb.uri 中是否有提供自动重连的选项?
    【解决方案5】:

    您可以通过扩展 AbstractMongoConfiguration 来定义更多细节。

    @Configuration
    @EnableMongoRepositories("demo.mongo.model")
    public class SpringMongoConfig extends AbstractMongoConfiguration {
        @Value("${spring.profiles.active}")
        private String profileActive;
    
        @Value("${spring.application.name}")
        private String proAppName;
    
        @Value("${spring.data.mongodb.host}")
        private String mongoHost;
    
        @Value("${spring.data.mongodb.port}")
        private String mongoPort;
    
        @Value("${spring.data.mongodb.database}")
        private String mongoDB;
    
        @Override
        public MongoMappingContext mongoMappingContext()
            throws ClassNotFoundException {
            // TODO Auto-generated method stub
            return super.mongoMappingContext();
        }
        @Override
        @Bean
        public Mongo mongo() throws Exception {
            return new MongoClient(mongoHost + ":" + mongoPort);
        }
        @Override
        protected String getDatabaseName() {
            // TODO Auto-generated method stub
            return mongoDB;
        }
    }
    

    【讨论】:

    • 用户名和密码在哪里指定?当我们在 applicaiton.properties 中定义它然后扩展 AbstractMongoConfiguration 时,它会提供未经授权的异常。
    • 它将在 application.properties 中
    • 使用配置文件变量是否正确? if(profileActive=="dev"){ return new Fongo(getDatabaseName()).getMongo();} else { return new MongoClient(url, port); }
    【解决方案6】:

    如果有人试图在 application.properties 中连接到 Atlas MongoDB 集群,则必须具有如下配置:

    spring.data.mongodb.uri=mongodb+srv://databaseUsername:usernamePassword@cluster0.j4koa.mongodb.net/databaseUsername?retryWrites=true&w=majority
    

    【讨论】:

      【解决方案7】:

      在我的例子中,我需要设置 MongoDB 以使用 Testcontainers 进行集成测试。由于必须在运行时指定 Mongo 端口,因此不能使用properites 文件。我想保留 SpringBoot 提供的原始 MongoDB 自动配置,但覆盖了一些属性。这可以通过定义一个 MongoClientSettingsBuilderCustomizer 类型的 bean 来实现,该 bean 可用于自定义 mongo 设置:

      @Bean
      public MongoClientSettingsBuilderCustomizer clientSettingsBuilderCustomizer(final GenericContainer<?> mongoDBContainer) {
           String database = environment.getProperty("spring.data.mongodb.database");
           ConnectionString connectionString = new ConnectionString(String.format("mongodb://localhost:%s/%s", mongoDBContainer.getFirstMappedPort(), database));
           return settings -> settings.applyConnectionString(connectionString);
      }
      

      【讨论】:

        【解决方案8】:

        您可以在 Spring Boot 2.0 中通过创建自定义 MongoClient 添加为 Connection 提供更多控制,

        请关注github Link for Full Source Code

        @Configuration
        @EnableMongoRepositories(basePackages = { "com.frugalis.repository" })
        @ComponentScan(basePackages = { "com.frugalis.*" })
        @PropertySource("classpath:application.properties")
        public class MongoJPAConfig extends AbstractMongoConfiguration {
        
            @Value("${com.frugalis.mongo.database}")
            private String database;
            @Value("${com.frugalis.mongo.server}")
            private String host;
            @Value("${com.frugalis.mongo.port}")
            private String port;
            @Value("${com.frugalis.mongo.username}")
            private String username;
            @Value("${com.frugalis.mongo.password}")
            private String password;
        
        
            @Override
            protected String getDatabaseName() {
                return database;
            }
        
            @Override
            protected String getMappingBasePackage() {
                return "com.frugalis.entity.mongo";
            }
        
            @Bean
            public MongoTemplate mongoTemplate() throws Exception {
                return new MongoTemplate(mongoClient(), getDatabaseName());
            }
        
            @Override
            @Bean
            public MongoClient mongoClient() {
        
                List<MongoCredential> allCred = new ArrayList<MongoCredential>();
                System.out.println("???????????????????"+username+" "+database+" "+password+" "+host+" "+port);
                allCred.add(MongoCredential.createCredential(username, database, password.toCharArray()));
                MongoClient client = new MongoClient((new ServerAddress(host, Integer.parseInt(port))), allCred);
                client.setWriteConcern(WriteConcern.ACKNOWLEDGED);
        
                return client;
            }} 
        

        【讨论】:

        • 这是怎么回事?什么 - 添加一个类?什么是 JPA?你在这个文件中的导入在哪里?这充其量是一个不完整的答案。
        【解决方案9】:

        如果您只是想从环境变量中读取 MongoDB 连接字符串,一种方法是设置以下环境变量:

        SPRING_DATA_MONGODB_URI=mongodb://localhost:27017/trying-mongo
        

        这不需要对application.properties 进行任何更改,因为spring data mongo 默认会从上述环境变量中读取值。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-05-09
          • 2017-10-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-05-06
          • 1970-01-01
          相关资源
          最近更新 更多