在maven项目中使用mongo java driver 3.12时,我在尝试存储某些POJO时遇到以下错误:
编码“\u id”时出错:找不到类java.lang.object的编解码器。
为了复制这个错误,我需要相当多的代码行,所以我在github上设置了一个项目,其中包含复制错误的代码。以下是其内容的简短版本:
public abstract class Identification {...}
public class StringID extends Identification {
@BsonId
private String id;
// @BsonCreator, getId(), ...
}
public abstract class BasicDBItem<T extends Identification> {
@BsonId
private T id;
@BsonCreator
public BasicDBItem(@BsonProperty("id") T id) {
this.id = id;
}
public T getId() {
return this.id;
}
// ...
}
public abstract class GenericItem<T extends Identification> extends BasicDBItem<T> {
@BsonCreator
public GenericItem(@BsonProperty("id") T id) {
super(id);
}
public abstract void foo();
}
public class SpecificItem extends GenericItem<StringID> {
@BsonCreator
public SpecificItem(@BsonProperty("id") StringID id) {
super(id);
}
}
public class App {
public App() {
CodecProvider pojoCodecProvider = PojoCodecProvider.builder()
.register("stackoverflow.issues.r329433.mongodb.pojos").build();
CodecRegistry pojoCodecRegistry = CodecRegistries.fromRegistries(MongoClientSettings.getDefaultCodecRegistry(),
CodecRegistries.fromProviders(pojoCodecProvider));
/* setup mongo client */
MongoClient client = MongoClients.create(MongoClientSettings.builder()
.applyToClusterSettings(builder -> builder.hosts(Arrays.asList(new ServerAddress("localhost", 27017))))
.codecRegistry(pojoCodecRegistry).build());
MongoCollection<SpecificItem> collection = client.getDatabase("BSON-Test").getCollection("Items", SpecificItem.class);
SpecificItem item = new SpecificItem(new StringID("Item-ID"));
collection.insertOne(item); // error here
}
}
mongodb文档声明泛型是完全受支持的,只要继承深度小于或等于1,泛型就似乎是正确的。所以如果你把 GenericItem
从等级制度中 SpecificItem
直接继承自 BasicDBItem
一切正常。但是在这中间添加另一个类 GenericItem
导致程序崩溃,错误如上所示。
我试图找出原因,但到目前为止我没有运气。一开始我怀疑它是由类型擦除引起的,但是根据文档,泛型应该被替换为 Identification
而不是 Object
如果我没弄错的话。
所以我不知道该怎么办。继承深度为1是非常有限的,我不想放弃我的类层次结构。由于在我最初的项目中有很多类,所以为每个类编写一个编解码器太多,而且效率非常低(更不用说这是一项大量的工作,而且可维护性非常糟糕)。
任何形式的帮助都是非常感谢的。
暂无答案!
目前还没有任何答案,快来回答吧!