繁体   English   中英

GridFS:找不到自定义类的编解码器

[英]GridFS: Can't find a codec for custom class

我正在使用具有数据模型的遗留应用程序,其中给定的 MongoDB 文档有时可能超过 16MB。 这当然会在 Mongo 中引发异常,因此我们决定将几个集合转移到没有这个大小限制的 GridFS。 然而,虽然我们能够成功地将其中一个集合转移到 GridFS,但在尝试插入存储在另一个集合中的 POJO 时,我们会收到以下错误:

org.bson.codecs.configuration.CodecConfigurationException:找不到类 com.tjb.entities.SomePojo 的编解码器

我在这里和其他地方对此进行了研究,并找到了一些可能的修复方法。 然而,这些修复似乎只适用于普通的 Mongo,而不是 GridFS。

有没有办法为 GridFS 配置自定义编解码器? 我假设可能有一种方法可以让 GridFS 存储 POJO,因为普通的 Mongo 已经有能力这样做。

作为参考,POJO 仅包含String 、Java 原语、 List和对象字段。 一些字段已被标记为@Transient ,以防万一。 我使用 Spring 数据作为 Mongo 的接口。

在解决这个问题 1 多天后,我尝试改用 Gson 向 GridFS 写入一个简单的 JSON String ,这应该已经消除了底层 Java 对象的序列化问题。 令我惊讶的是,同样的编解码器错误仍然存​​在。 经过仔细检查,我发现错误是由这些令人不安的线路引起的:

DBObject metaData = new BasicDBObject();
metaData.put(Fields.DOCUMENTS_LIST, listOfSomePojo);

这里listOfSomePojo是一些 POJO 的ArrayList ,每个 POJO 对象都有一个我想用于搜索的字段。 这就是导致编解码器错误的原因,因为 GridFS 无法弄清楚我想要做什么。 我的意图是包含该集合,其中的每个对象都有一个用于搜索的_id字段。 这是我使用的解决方法:

List<String> docIds = deal.getDocumentsList().stream()
    .map(x -> x.getId())
    .collect(Collectors.toList());
metaData.put(Fields.DOCUMENTS_LIST, docIds);

也就是说,我只是将一个普通的List<String>添加到元数据字段之一,然后使用它进行搜索。 这修复了编解码器错误,现在一切正常。

附带说明一下,如果您遇到类似的问题,请确保您希望存储在 GridFS 中的任何对象都是可序列化的,以及所有子对象也是可序列化的。 如果没有,它也将不起作用。

我不确定它是否与您描述的问题完全相关,但我遇到了类似的问题 - 编写 GridFSFile 到了可以正常工作的地步,但是对文件的任何读取(例如,在Cursor<GridFSFile>中)导致编解码器故障。 (GridFSFile 没有公共构造函数,配置编解码器等)我最终在调试器中跟踪它,看到有一个解码器出现,但它是一个 AutomaticPojo 编解码器,而不是GridFSFileCodec。

这最终指向了我将其他编解码器添加到注册表的位置。 该代码看起来像:

CodecProvider someCodec = PojoCodecProvider.builder().....
List<CodecProvider> lotsOfThese = new ArrayList<>(); 
CodecRegistry cr = new ProvidersCodecRegistry(lotsOfThese);
CodecRegistry whole = CodecRegistries.fromRegistries(cr, db.getCodecRegistry());
db = db.withCodecRegistry(whole);

但我不明白的是,编解码器具有匹配的规则和顺序,因此很重要——注册表联合(cr,defaults)的行为与(defaults,cr)不同——即使我认为我有一个包规则我的 PojoCodecProvider 在它达到编解码器注册表中的默认值之前,它似乎已经匹配了 GridFSFile。

翻转工会中的订单为我解决了几个问题。

CodecRegistry whole = CodecRegistries.fromRegistries(db.getCodecRegistry(), cr);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM