Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java GridFS:Can';找不到自定义类的编解码器_Java_Mongodb_Codec_Gridfs - Fatal编程技术网

Java GridFS:Can';找不到自定义类的编解码器

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类的

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

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

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

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


作为参考,POJO只包含
字符串
、Java原语、
列表
和对象字段。一些字段被标记为
@Transient
,以防万一。我正在使用Spring数据作为Mongo的接口。

在与这个问题斗争了一天多之后,我尝试使用Gson向GridFS编写一个简单的JSON
字符串,它本应消除并解决底层Java对象的序列化问题。令我惊讶的是,同样的编解码器错误依然存在。经过仔细检查,我发现错误是由这些令人不安的线条造成的:

DBObject metaData = new BasicDBObject();
metaData.put(Fields.DOCUMENTS_LIST, listOfSomePojo);
这里的somepojo
listOfSomePojo
是某个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中的任何对象都是可序列化的,并且所有子对象都是可序列化的。如果没有,它也不会起作用