作为刚接触Spring Boot的新手,我想知道如何配置MongoDB的连接细节。我尝试了常规示例,但没有一个涵盖连接细节。
我想指定要使用的数据库以及运行MongoDB的主机的url/端口。
有什么提示或建议吗?
作为刚接触Spring Boot的新手,我想知道如何配置MongoDB的连接细节。我尝试了常规示例,但没有一个涵盖连接细节。
我想指定要使用的数据库以及运行MongoDB的主机的url/端口。
有什么提示或建议吗?
引用 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;
MONGO_INITDB_ROOT_USERNAME
和MONGO_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>
MONGO_INITDB_ROOT_USERNAME
,而是MONGO_INITDB_ROOT_PASSWORD
。 - Kamil Witkowskispring.data.mongodb.host
和spring.data.mongodb.port
在使用Mongo 3.0 Java driver时不被支持。 在这种情况下,应该使用spring.data.mongodb.uri
来提供所有的配置,像这样:
spring.data.mongodb.uri=mongodb://user:secret@mongo1.example.com:12345
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
通过扩展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;
}
}
if(profileActive=="dev"){ return new Fongo(getDatabaseName()).getMongo();} else { return new MongoClient(url, port); }
- anat0lius如果有人试图在application.properties中连接Atlas MongoDB Cluster,必须具备以下配置:
spring.data.mongodb.uri=mongodb+srv://databaseUsername:usernamePassword@cluster0.j4koa.mongodb.net/databaseUsername?retryWrites=true&w=majority
在我的情况下,我需要使用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);
}
如果您只想从环境变量中读取MongoDB连接字符串,一种方法是设置以下环境变量:
SPRING_DATA_MONGODB_URI=mongodb://localhost:27017/trying-mongo
这不需要在application.properties
中做任何更改,因为Spring Data Mongo默认会从上面的环境变量中读取该值。
在 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;
}}
spring.data.mongodb.host
这样的配置属性在哪里有文档记录?我是不是只能查看MongoProperties
类的API文档或源代码?(请注意,本回答开头的特定引用似乎不再出现在提到的Spring Boot文档中;spring.data.mongodb.uri
也没有出现在Spring Data MongoDB - 参考文档中。) - Garret Wilson