首页 > 解决方案 > 如何轻松配置编解码器?

问题描述

框架使用 LUUID 来存储 java.util.UUID,但我们希望在 mongodb 中以标准 UUID 格式保存。如果我们将 BsonUUIDCodec 配置为 Standard 类型,就可以实现。

我们已经尝试使用 bean ReactiveMongoDatabaseFactory 进行配置来配置编解码器。它工作,但它不舒服我们还需要提供数据库,uri 等。

我们的实现:

@Bean
    fun mongoFactory(
        environment: ConfigurableEnvironment
    ): ReactiveMongoDatabaseFactory {
        val builder = MongoClientSettings.builder()

        val codecRegistry =
            fromRegistries(fromCodecs(UuidCodec(UuidRepresentation.STANDARD)), getDefaultCodecRegistry())
        builder.codecRegistry(codecRegistry)

        val database = requireNotNull(environment.getProperty(DATABASE_PROPERTY)) { "Database must be specified" }
        val uri = requireNotNull(environment.getProperty(URI_PROPERTY)) { "URI must be specified" }

        val connectionString = if (!uri.contains(database)) {
            "$uri/$database"
        } else {
            uri
        }
        builder.applyConnectionString(ConnectionString(connectionString))

        val mongoClient = MongoClients.create(builder.build())
        return SimpleReactiveMongoDatabaseFactory(mongoClient, database)
    }

我们希望提供编解码器而不覆盖其他设置,例如 uri 和数据库以及其他设置的自定义配置。还有更简单的配置编解码器的方法吗?

标签: springkotlinspring-data-mongodb

解决方案


可以通过 MongoClientSettingsBuilderCustomizer 来完成,类似这样。

@Bean
fun customMongoClientSettings(): MongoClientSettingsBuilderCustomizer {
    return MongoClientSettingsBuilderCustomizer {
        val codecRegistry = fromRegistries(
            fromCodecs(UuidCodec(UuidRepresentation.STANDARD)), getDefaultCodecRegistry()
        )
        it.codecRegistry(codecRegistry)
    }
}

推荐阅读