Java-драйвер Mongo говорит, что классы верхнего уровня с универсальными типами не поддерживаются PojoCodec

Я пытаюсь использовать драйвер 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. Но они не могут быть декодированы по вышеуказанной причине. Если не изменить все мои модели данных, что еще я могу сделать? Можно ли как-то самостоятельно указать соответствующие кодеки?


person user1145925    schedule 16.09.2019    source источник


Ответы (1)


Можете ли вы попытаться обернуть свои общие типы конкретными типами и попробовать еще раз?

class DoubleMultiVal extends MultiVal<Double> {
}

class LocalDateMultiVal extends MultiVal<LocalDate> {
}

и использовать их в AbstractBigObject;

@BsonProperty 
private Map<String, LocalDateMultiVal> nameToMultiDateVal = Maps.newHashMap();
@BsonProperty 
private Map<String, DoubleMultiVal> nameToMultiDoubleVal = Maps.newHashMap();
person buræquete    schedule 26.09.2019
comment
Я уже знал об этом возможном подходе. Но я написал в своем первоначальном вопросе: если не изменить все мои модели данных, что еще я могу сделать? Это решение включает в себя изменение нескольких моих моделей данных. - person user1145925; 30.09.2019
comment
Сообщение об ошибке @ user1145925 очень ясное, вы не можете быть таким универсальным, нет решения, которое я смог бы найти без изменения структуры класса. Извините, я не увидел эту часть вопроса =/ Я не смог настроить PojoCodecProvider, чтобы разрешить общую поддержку... - person buræquete; 30.09.2019