Spring Boot如何配置连接MongoDB的详细信息?

127

作为刚接触Spring Boot的新手,我想知道如何配置MongoDB的连接细节。我尝试了常规示例,但没有一个涵盖连接细节。

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

有什么提示或建议吗?

9个回答

136

引用 Boot Docs的话:

您可以设置spring.data.mongodb.uri属性来更改URL,或者指定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;

嘿,如果我使用Spring Boot创建一个普通的Web应用程序,我需要做同样的事情吗?我在哪里可以找到application.properties文件? - Theo
如果您不想依赖默认选项,您需要自己编写代码:http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html - Artem Bilan
请注意,如果您想设置密码字段,可能会有问题,因为它是一个char[]。相反,请使用uri字段。请参阅此错误报告底部:https://github.com/spring-projects/spring-boot/issues/536 - grahamrb
spring.data.mongodb.host这样的配置属性在哪里有文档记录?我是不是只能查看MongoProperties类的API文档或源代码?(请注意,本回答开头的特定引用似乎不再出现在提到的Spring Boot文档中;spring.data.mongodb.uri也没有出现在Spring Data MongoDB - 参考文档中。) - Garret Wilson
已修复答案中的链接,指向实际文档。 - Artem Bilan

53
需要注意的是,MongoDB有“认证数据库”的概念,该数据库可以与您连接的数据库不同。例如,如果您使用Mongo的官方Docker镜像并指定环境变量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>

1
如果是“密码”,则不是MONGO_INITDB_ROOT_USERNAME,而是MONGO_INITDB_ROOT_PASSWORD - Kamil Witkowski
你这个人真是救了我。谢谢你。 - MorningDew

46

spring.data.mongodb.hostspring.data.mongodb.port 在使用Mongo 3.0 Java driver时不被支持。 在这种情况下,应该使用spring.data.mongodb.uri来提供所有的配置,像这样:

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

17
如果您没有用户名或密码怎么办? - JayC
1
@Jesse 在这种情况下没问题,Mongo默认不需要任何身份验证,所以连接会成功。 - julianm
在spring.data.mongodb.uri中有自动重新连接的选项吗? - Satish Patro
这个能用于独立的Spring Data应用程序吗? - Sumanth Varada
1
属性文件中的秘密很可疑。直接以未加密的形式进入版本控制系统。 - html_programmer
如果我的密码中有“@”,我该如何连接? - Youssef Boudaya

24
在一个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会自动使用这个文件配置您的应用程序。然后,您可以使用集成配置文件启动Spring Boot应用程序(并使用本地MongoDB)。

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

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

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

在 spring.data.mongodb.uri 中是否有自动重新连接的选项? - Satish Patro

19

通过扩展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;
    }
}

用户名和密码在哪里指定?当我们只在application.properties中定义它,然后扩展AbstractMongoConfiguration时,它会给出未经授权的异常。 - Noor Syed
它将位于application.properties文件中。 - Mari Murotani
使用profile变量这样做是正确的吗?if(profileActive=="dev"){ return new Fongo(getDatabaseName()).getMongo();} else { return new MongoClient(url, port); } - anat0lius

5

如果有人试图在application.properties中连接Atlas MongoDB Cluster,必须具备以下配置:

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

2

在我的情况下,我需要使用Testcontainers来设置MongoDB进行集成测试。由于Mongo端口必须在运行时指定,因此无法使用属性文件。我希望保留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);
}

2

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

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

这不需要在application.properties中做任何更改,因为Spring Data Mongo默认会从上面的环境变量中读取该值。


0

Spring Boot 2.0 中,您可以通过创建自定义 MongoClient 来提供更多的连接控制。以下是操作步骤:

请访问 GitHub 链接以获取完整源代码

@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;
    }} 

1
这是如何操作的?添加一个类吗?JPA是什么?你的导入在这个文件里面吗?这最多只是一个不完整的答案。 - barrypicker

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