Mongo Java驱动程序说PojoCodec不支持具有泛型类型的顶级类

问题描述 投票:1回答:1

我正在尝试使用MongoDB Reactive Streams Java Driver 1.11,但不使用https://jongo.org/。似乎正在使用https://mongodb.github.io/mongo-java-driver/3.10/。我还有很多其他的注册类都可以正常工作。我已经看过Mongodb java: Perist POJO class with generic field,但是我无法选择迁移所有数据以删除具有泛型的字段。我也不明白为什么我什至会看到这个错误,因为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);

因此,我在Mongo集合中存储了很多BigObject。但是由于上述原因,它们无法被解码。如果不更改所有数据模型,我还能做什么?我有什么办法可以自己指定相关的编解码器?

java mongodb generics mongo-java mongo-java-driver
1个回答
0
投票

您可以尝试用具体类型包装通用类型并重试吗?

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();
© www.soinside.com 2019 - 2024. All rights reserved.