Я использую mongo-java-driver-3.7.0-rc0 и около двух дней бьюсь с регистрацией кодеков. Я попробовал два подхода (из провайдеров и из кодеков) - ни один не работал. Моя текущая реализация (на основе документации) выглядит так:
CodecRegistry cr =
fromRegistries(com.mongodb.MongoClient.getDefaultCodecRegistry(),
CodecRegistries.fromProviders(new MongoCacheDocumentCodecProvider()));
MongoClientSettings mongoSettings = MongoClientSettings.builder()
.applyConnectionString(connectionString)
.codecRegistry(cr)
.build();
client = MongoClients.create(mongoSettings);
(...)
MongoCollection<MongoCacheDocument> collection =
db.getCollection(dbName, MongoCacheDocument.class);
После этого я вижу в отладчике, что он зарегистрирован, однако при попытке, например, получить этот объект
collection.find()
OR
collection.find(MongoCacheDocument.class)
Я получаю ClassCastException HashMap -> MongoCacheDocument. Когда я делаю это для org.bson.Document, все идет хорошо.
Насколько я понимаю, поиск кодеков, выполненный Монго, выполняется рекурсивно. Почему тогда это не решается правильно, в то время как кодек зарегистрирован (кстати, отладчик не показывает, что есть какая-либо активность в поставщике нестандартного кода / кодека).
Кто-нибудь сталкивался с подобными проблемами? Может быть, это ошибка в 3.7.0-rc0, о которой я не знаю?
PS. Причина, по которой я использую RC, заключается в том, что он поддерживает более широкий спектр кодеков POJO в автоматическом режиме и хочет быть как можно более актуальным, в основном потому, что Mongo API любит время от времени меняться:).
РЕДАКТИРОВАТЬ: я заметил, что он возвращает MapCodec (FYI: MongoCacheDocument расширяет org.bson.Document). Я вижу, что Document реализует Map, однако нет проблем с поиском кодека именно для Document.