gpt4 book ai didi

java - Mongo java 驱动程序表示 PojoCodec 不支持具有泛型类型的顶级类

转载 作者:太空宇宙 更新时间:2023-11-04 09:23:58 25 4
gpt4 key购买 nike

我正在尝试使用 MongoDB Reactive Streams Java Driver 1.11 ,出发https://jongo.org/ 。似乎正在使用 https://mongodb.github.io/mongo-java-driver/3.10/ 。我还有很多其他运行良好的注册类(class)。我看过Mongodb java: Perist POJO class with generic field ,但我无法选择迁移所有数据以删除具有泛型的字段。我也不明白为什么我会看到这个错误,因为 MultiVal 甚至不是顶级 POJO;它嵌入在 AbstractBigObject 中。任何帮助将不胜感激。

下面是我看到的错误。

org.bson.codecs.configuration.CodecConfigurationException: Failed to decode 'BigObject'. Decoding 'nameToMultiDateVal' errored with: MultipleVal contains generic types that have not been specialised. Top level classes with generic types are not supported by the 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 。但由于上述原因,它们无法被解码。除了更改所有数据模型之外,我还能做什么?有什么方法可以让我自己指定相关的编解码器吗?

最佳答案

您可以尝试用具体类型包装泛型类型,然后再试一次吗?

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();

关于java - Mongo java 驱动程序表示 PojoCodec 不支持具有泛型类型的顶级类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57965620/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com