Я пытаюсь использовать драйвер Java MongoDB Reactive Streams 1.11, уходит с https://jongo.org/. Кажется, он использует https://mongodb.github.io/mongo-java-driver/3.10/. У меня есть куча других зарегистрированных классов, которые работают нормально. Я просмотрел Mongodb java: класс Perist POJO с общим полем, но у меня нет возможности перенести все мои данные, чтобы удалить поля с дженериками. Я также не понимаю, почему я вообще вижу эту ошибку, поскольку MultiVal
даже не является POJO верхнего уровня; он встроен в AbstractBigObject
. Любая помощь будет оценена по достоинству.
Ниже приведена ошибка, которую я вижу.
org.bson.codecs.configuration.CodecConfigurationException: не удалось декодировать «BigObject». При декодировании 'nameToMultiDateVal' возникла ошибка: MultipleVal содержит универсальные типы, которые не были специализированы. Классы верхнего уровня с универсальными типами не поддерживаются PojoCodec.
Ниже приведены некоторые из моих соответствующих моделей данных:
public abstract class AbstractBigObject {
@BsonProperty
private Map<String, MultiVal<LocalDate>> nameToMultiDateVal = Maps.newHashMap();
@BsonProperty
private Map<String, MultiVal<Double>> nameToMultiDoubleVal = Maps.newHashMap();
...
}
public class BigObject extends AbstractBigObject {
...
}
public class MultiVal<T> {
private List<Val<T>> options;
private Val<T> selected;
...
}
@BsonDiscriminator(key = "type")
public interface Val<T> {
...
}
@BsonDiscriminator(key = "type", value = "dateVal")
public class DateVal implements Val<LocalDate> {
...
}
@BsonDiscriminator(key = "type", value = "doubleVal")
public class DoubleVal implements Val<Double> {
...
}
Ниже показано, как я настраиваю свой реестр кодеков.
MongoClient mongoClient = MongoClients.create(new ConnectionString(mongoConfig.getUri()));
PojoCodecProvider pojoCodecProvider = PojoCodecProvider.builder()
.conventions(ImmutableList.of(CLASS_AND_PROPERTY_CONVENTION, ANNOTATION_CONVENTION))
.register(
BigObject.class,
AbstractBigObject.class,
MultiVal.class)
.register(
ClassModel.builder(Val.class).enableDiscriminator(true).build(),
ClassModel.builder(DoubleVal.class).enableDiscriminator(true).build(),
ClassModel.builder(DateVal.class).enableDiscriminator(true).build())
.automatic(true)
.build();
CodecRegistry codecRegistry = CodecRegistries.fromRegistries(
MongoClientSettings.getDefaultCodecRegistry(),
CodecRegistries.fromProviders(pojoCodecProvider));
mongoDb = mongoClient.getDatabase(mongoConfig.getDbName()).withCodecRegistry(codecRegistry);
Поэтому я храню много BigObject
в коллекции Mongo. Но они не могут быть декодированы по вышеуказанной причине. Если не изменить все мои модели данных, что еще я могу сделать? Можно ли как-то самостоятельно указать соответствующие кодеки?