我在用Micronaut为MongoDB配置对象映射时遇到了一些困难。我遇到了错误,比如:
解码为“资产”失败,但有以下例外: 找不到“资产”的公共构造函数。 自定义代码或PojoCodec可能需要显式配置和注册以处理此类型。org.bson.codecs.configuration.CodecConfigurationException:使用AutomaticPojoCodec解码时发生异常。解码为“资产”失败,但有以下例外: 找不到“资产”的公共构造函数。 自定义代码或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,但我不知道要在该设置中输入什么才能使其工作。
任何帮助都是非常感谢的!
发布于 2019-02-15 19:12:16
您可以简单地将codec注册表定义为bean。由于您没有控制正在注册的类,所以可以创建一个工厂
@Factory
class KMongoFactory {
@Singleton
fun kCodecRegistry(): CodecRegistry {
return ClassMappingType.codecRegistry(MongoClientSettings.getDefaultCodecRegistry());
}
}像上面这样的东西应该可以做到。
编辑:注意默认情况下添加了MongoClients.getDefaultCodecRegistry()
https://stackoverflow.com/questions/54714058
复制相似问题