gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 17:41:37 28 4
gpt4 key购买 nike

我正在使用一个遗留应用程序,该应用程序的数据模型中给定的 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 的接口(interface)。

最佳答案

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

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

这里listOfSomePojoArrayList一些 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 中的任何对象都是可序列化的,并且所有子对象也是可序列化的。如果没有,它也不起作用。

关于java - GridFS:找不到自定义类的编解码器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60943175/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com