首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Micronaut和Kotlin + KMongo为MongoDB配置对象映射?

如何使用Micronaut和Kotlin + KMongo为MongoDB配置对象映射?
EN

Stack Overflow用户
提问于 2019-02-15 17:11:26
回答 1查看 1.9K关注 0票数 3

我在用Micronaut为MongoDB配置对象映射时遇到了一些困难。我遇到了错误,比如:

解码为“资产”失败,但有以下例外: 找不到“资产”的公共构造函数。 自定义代码或PojoCodec可能需要显式配置和注册以处理此类型。org.bson.codecs.configuration.CodecConfigurationException:使用AutomaticPojoCodec解码时发生异常。解码为“资产”失败,但有以下例外: 找不到“资产”的公共构造函数。 自定义代码或PojoCodec可能需要显式配置和注册以处理此类型。

使用KMongo,这很容易。然而,由Micronaut注入的MongoClient并没有KMongo的编解码器注册。

我可以让它工作如下:

代码语言:javascript
复制
    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,但我不知道要在该设置中输入什么才能使其工作。

任何帮助都是非常感谢的!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-15 19:12:16

您可以简单地将codec注册表定义为bean。由于您没有控制正在注册的类,所以可以创建一个工厂

代码语言:javascript
复制
@Factory
class KMongoFactory {

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

}

像上面这样的东西应该可以做到。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54714058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档