在不明确指定连接字符串的情况下自动装配 MongoClient 和 MongoClientSettings

Autowiring MongoClient and MongoClientSettings without explicitly specifying a Connection String

我正在升级 MongoDB 驱动程序,这需要从较旧的 MongoClientOptions 转移到较新的 MongoClientSettings

在旧的实现中,在 @Configuration class 中使用了以下配置,ConnectionString 从 spring.data.mongodb.uri@Autowired MongoTemplate 推断:

@Bean
public MongoClientOptions mongoOptions() {
        Builder clientOptionsBuilder = MongoClientOptions.builder()
                //Timeout Configurations
                if(sslIsEnabled) {                  
                    clientOptionsBuilder.sslEnabled(true) 
                    //Other SSL options
                }
        return clientOptionsBuilder.build();    
    }

而在较新的实现中,特别需要一个 ConnectionString 参数,并且不会自动选择 属性 文件 spring.data.mongodb.uri。因此,我使用 @Value 注释指定了连接字符串。不这样做会导致程序将 localhost:27017 推断为连接源。

@Value("${spring.data.mongodb.uri}")
String connectionString;

@Bean
public MongoClient mongoClient() {
    MongoClientSettings.Builder clientSettingsBuilder = MongoClientSettings.builder()
            .applyToSocketSettings(builder -> {
                // Timeout Configurations
            }).applyConnectionString(new ConnectionString(connectionString));
    if (sSLEnabled) {
        clientSettingsBuilder.applyToSslSettings(builder -> {
            builder.enabled(sslIsEnabled);
            //Other SSL Settings
        });
    }
    return MongoClients.create(clientSettingsBuilder.build());
}

虽然文档和其他 Whosebug 帖子提到 MongoClientSettings 会覆盖 属性 文件条目,但有没有办法从 属性 文件中 retrieve/infer MongoClientSettings,然后将其他自定义配置附加到是吗?

我正在使用 Spring Boot 2.6 和 spring 启动器依赖项 MongoDB

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

我发现之前 GitHub 上有人问过类似的问题。

Modify MongoClientSettings while using auto configuration with mongodb #20195

将具有 MongoClientOptions@Bean 配置替换为 MongoClientSettingsBuilderCustomizer 有助于解决问题。

@Bean
public MongoClientSettingsBuilderCustomizer mongoDBDefaultSettings()
        throws KeyManagementException, NoSuchAlgorithmException {

    return builder -> {
        builder.applyToSocketSettings(bldr -> {
        //Apply any custom socket settings
        });
        builder.applyToSslSettings(blockBuilder -> {
        // Apply SSL settings
        });
        // Apply other settings to the builder.
    };
}