如何轻松配置编解码器?

时间:2019-10-01 16:54:05

标签: spring kotlin spring-data-mongodb

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

我们已经尝试使用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和数据库以及其他设置的自定义配置。 还有更简单的配置编解码器的方法吗?

1 个答案:

答案 0 :(得分:0)

可以通过MongoClientSettingsBuilderCustomizer完成,就像这样。

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