Java GridFS:Can';找不到自定义类的编解码器
我正在使用一个遗留应用程序,该应用程序具有一个数据模型,其中给定的MongoDB文档有时会超过16MB。这当然会在Mongo中触发一个异常,因此我们决定将两个集合转移到GridFS,它没有这个大小限制。但是,虽然我们能够成功地将其中一个集合转移到GridFS,但在尝试插入存储在另一个集合中的POJO时,我们遇到以下错误: org.bson.codecs.configuration.CodecConfigurationException:找不到com.tjb.entities.SomePojo类的编解码器 我在这里和其他地方对此进行了研究,并找到了一些可能的修复方法。然而,这些修复似乎只适用于普通的Mongo,而不是GridFS 有没有办法为GridFS配置自定义编解码器?我假设可能有一种方法可以让GridFS存储POJO,因为常规Mongo已经能够这样做了Java GridFS:Can';找不到自定义类的编解码器,java,mongodb,codec,gridfs,Java,Mongodb,Codec,Gridfs,我正在使用一个遗留应用程序,该应用程序具有一个数据模型,其中给定的MongoDB文档有时会超过16MB。这当然会在Mongo中触发一个异常,因此我们决定将两个集合转移到GridFS,它没有这个大小限制。但是,虽然我们能够成功地将其中一个集合转移到GridFS,但在尝试插入存储在另一个集合中的POJO时,我们遇到以下错误: org.bson.codecs.configuration.CodecConfigurationException:找不到com.tjb.entities.SomePojo类的
作为参考,POJO只包含
字符串
、Java原语、列表
和对象字段。一些字段被标记为@Transient
,以防万一。我正在使用Spring数据作为Mongo的接口。在与这个问题斗争了一天多之后,我尝试使用Gson向GridFS编写一个简单的JSON字符串,它本应消除并解决底层Java对象的序列化问题。令我惊讶的是,同样的编解码器错误依然存在。经过仔细检查,我发现错误是由这些令人不安的线条造成的:
DBObject metaData = new BasicDBObject();
metaData.put(Fields.DOCUMENTS_LIST, listOfSomePojo);
这里的somepojolistOfSomePojo
是某个POJO的ArrayList
,每个POJO的对象都有一个我想用于搜索的字段。这就是导致编解码器错误的原因,因为GridFS无法理解我在尝试做什么。我的意图是包含集合,其中每个对象都有一个\u id
字段用于搜索。以下是我使用的解决方法:
List<String> docIds = deal.getDocumentsList().stream()
.map(x -> x.getId())
.collect(Collectors.toList());
metaData.put(Fields.DOCUMENTS_LIST, docIds);
List docIds=deal.getDocumentsList().stream()
.map(x->x.getId())
.collect(Collectors.toList());
metaData.put(字段、文档列表、文档ID);
也就是说,我只是在其中一个元数据字段中添加了一个普通的列表
,然后使用它进行搜索。这修复了编解码器错误,现在一切正常
另外,如果您遇到类似的问题,请确保您希望存储在GridFS中的任何对象都是可序列化的,并且所有子对象都是可序列化的。如果没有,它也不会起作用