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

GridFS: Can't find a codec for custom class

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

org.bson.codecs.configuration.CodecConfigurationException: Can't find a codec for class 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 中的任何对象都是可序列化的,并且所有子对象也是可序列化的。不行的话也行不通。