3

我在使用 Kotlin 在 Micronaut 中为 MongoDB 配置对象映射时遇到了一些困难。我收到如下错误:

解码为“资产”失败,但出现以下异常:

找不到“资产”的公共构造函数。

可能需要显式配置和注册自定义 Codec 或 PojoCodec 以处理此类型。org.bson.codecs.configuration.CodecConfigurationException:使用 AutomaticPojoCodec 解码时发生异常。解码为“资产”失败,但出现以下异常:

找不到“资产”的公共构造函数。

可能需要显式配置和注册自定义 Codec 或 PojoCodec 以处理此类型。

使用 KMongo,这很容易。但是 Micronaut 注入的 MongoClient 没有 KMongo 的编解码器注册表。

我可以让它工作如下:

    val db: MongoDatabase by lazy {
        val codecRegistry = ClassMappingType.codecRegistry(MongoClientSettings.getDefaultCodecRegistry())
        client.getDatabase("db-name").withCodecRegistry(codecRegistry)
    }

此代码直接取自 KMongo。(顺便说一句,使用database.withKMongo()导致相同的错误)

虽然这可行,但我想让 Micronaut 使用 KMongo 创建客户端,或者让它使用上面的编解码器,使用配置(application.yml)。

codec-registry这里提到了一个设置: https ://micronaut-projects.github.io/micronaut-mongodb/latest/guide/configurationreference.html ,但我不知道在该设置中输入什么才能使其工作。

任何帮助表示赞赏!

4

1 回答 1

2

您可以简单地将编解码器注册表定义为 bean。由于您无法控制正在注册的类,您可以创建一个工厂

@Factory
class KMongoFactory {

    @Singleton
    fun kCodecRegistry(): CodecRegistry {
        return ClassMappingType.codecRegistry(MongoClientSettings.getDefaultCodecRegistry());
    }

}

像上面这样的事情应该这样做

编辑:请注意MongoClients.getDefaultCodecRegistry()默认情况下添加

于 2019-02-15T19:12:16.367 回答