GridFS: не удается найти код c для пользовательского класса - PullRequest
0 голосов
/ 31 марта 2020

Я работаю с устаревшим приложением, в котором есть модель данных, в которой данный документ MongoDB может иногда превышать 16 МБ. Это, конечно, вызовет исключение в Mon go, и поэтому мы решили перенести пару коллекций на GridFS, который не имеет этого ограничения по размеру. Однако, хотя мы смогли успешно перенести одну из коллекций в GridFS, при попытке вставить POJO, которые хранились в другой коллекции, мы получаем следующую ошибку:

org.bson.codecs .configuration.CodecConfigurationException: Не удается найти код c для класса com.tjb.entities.SomePojo

Я исследовал это здесь и в других местах и ​​нашел несколько возможных исправлений. Однако эти исправления, по-видимому, относятся только к обычному Mon go, а не к GridFS.

Есть ли способ настроить пользовательский код c для GridFS? Я предполагаю, что, вероятно, есть способ заставить GridFS хранить POJO, поскольку обычный Mon go уже имеет такую ​​возможность.

Для справки, POJO содержит только String, Java примитив, List и поля объекта. Несколько полей были помечены как @Transient на случай, если это будет иметь значение. Я использую данные Spring в качестве интерфейса в пн go.

1 Ответ

0 голосов
/ 01 апреля 2020

После борьбы с этой проблемой в течение 1+ дней я попытался вместо этого использовать Gson для записи простого JSON String в GridFS, который должен был устранить и решить проблему с сериализацией базового объекта Java. К моему удивлению, ошибка того же кода c сохранилась. При ближайшем рассмотрении я отследил ошибку, вызванную этими тревожными строками:

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

Здесь listOfSomePojo - это ArrayList некоторого POJO, каждый из объектов которого имел поле, которое я хотел использовать для поиска. Это и было причиной ошибки кода c, потому что GridFS не могла понять, что я пытался сделать. Я намеревался включить коллекцию, каждый объект которой имел поле _id для поиска. Вот обходной путь, который я использовал:

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

То есть я просто добавил вместо одного простого поля List<String> одно из полей метаданных, а затем искал его, используя его. Это исправило ошибку кода c, и теперь все работает.

В качестве примечания, если у вас возникла похожая проблема, также убедитесь, что любой объект, который вы sh хотите сохранить в GridFS является сериализуемым, как и все дочерние объекты. Если нет, то это тоже не сработает.

...