Spring Boot and how to configure connection details to MongoDB?

作为 Spring 引导的新手,我想知道如何为 MongoDB 配置连接细节。 我已经尝试了正常的例子,但没有一个涉及到连接的细节。

我想指定要使用的数据库和运行 MongoDB 的主机的 url/port。

有什么提示吗?

264738 次浏览

引用 启动文档的一句话:

可以设置 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;

在 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>

SpringBoot 将自动使用此文件来配置应用程序。然后,您可以使用集成概要文件(并使用本地 MongoDB)启动您的 Spring 启动应用程序

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

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

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

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

如果使用 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

下面是如何在 Spring Boot 2.0中创建自定义 MongoClient 添加为 Connection 提供更多控制,

请跟随 用于完整源代码的 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;
}}

同样需要注意的是 MongoDB 有“ 认证资料库”的概念,它可能不同于您所连接的数据库。例如,如果使用 蒙戈的官方码头图片并指定环境变量 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>

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

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

在我的例子中,我需要设置 MongoDB 来使用 TestContainer 进行集成测试。由于在运行时必须指定 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);
}

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

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

这不需要对 application.properties做任何修改,因为在默认情况下,mongo 会读取上述环境变量的值。