spring Sping Boot 以及如何配置连接到MongoDB的详细信息?

fruv7luv  于 2023-04-04  发布在  Spring
关注(0)|答案(9)|浏览(297)

作为Sping Boot 的新手,我想知道如何为MongoDB配置连接细节。我已经尝试了正常的示例,但没有一个涵盖连接细节。
我想指定将要使用的数据库和运行MongoDB的主机的url/端口。
有什么提示吗?

wfsdck30

wfsdck301#

引用 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;
oo7oh9g9

oo7oh9g92#

另外需要注意的是,MongoDB有“authentication database”的概念,它可以与您要连接的数据库不同。例如,如果您使用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>
vu8f3i0k

vu8f3i0k3#

如果您使用的是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
x6yk4ghg

x6yk4ghg4#

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

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

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

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

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

myzjeezk5#

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

yqyhoc1h6#

如果有人试图连接到www.example.com中的Atlas MongoDB集群application.properties必须具有如下配置:

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

q3qa4bjr7#

在我的例子中,我需要使用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);
}
whlutmcx

whlutmcx8#

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

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

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

xoshrz7s

xoshrz7s9#

这里是如何在Sping 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;
    }}

相关问题