如何在Micronaut和Kotlin + KMongo中配置MongoDB的对象映射?

3

我在使用Kotlin的Micronaut框架配置MongoDB的对象映射时遇到了一些困难。我收到了以下错误:

解码为“Asset”时失败,出现以下异常:

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

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

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

可能需要显式配置和注册自定义编解码器或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,但我不知道在那个设置中输入什么才能使其正常工作。 非常感谢您的帮助!

1
你能否在Github上分享Micronaut-Kotlin-KMongo的完整集成呢?这将非常有用! - Julien Deruere
1个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
2
你可以将编解码器注册表定义为一个bean。由于您无法控制正在注册的类,因此可以创建一个工厂。"最初的回答"。
@Factory
class KMongoFactory {

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

}

类似上面的代码应该可以完成

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


有没有可能你能在Github上分享一个完整的例子(Micronaut - Kotlin - KMongo),那将非常有用! - Julien Deruere
好的,我没有针对它的骨架项目,但我可以在Github上创建一个要点..这样有帮助吗? - Jeroen Knoef
那正是我所需要的。 - Julien Deruere
你如何在Java中实现这个? - qed
你能分享一下 @JeroenKnoef 的 gist 链接吗? - zooes
这里是:https://gist.github.com/jeroenknoef/3814cab50ec6aaa387048cc6707c0fbf。我从我们的代码库中复制并粘贴了一些代码,但你需要进行一些调整才能使其成为一个可工作的示例。 - Jeroen Knoef

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,