Java Can';找不到我的类的编解码器(CodeConfigurationException)
我需要在mongodb数据库中保存一个java对象。此对象中有另一个对象。当我尝试保存时,我在控制台上收到错误消息:Java Can';找不到我的类的编解码器(CodeConfigurationException),java,mongodb,codec,mongo-java-driver,Java,Mongodb,Codec,Mongo Java Driver,我需要在mongodb数据库中保存一个java对象。此对象中有另一个对象。当我尝试保存时,我在控制台上收到错误消息: org.bson.codecs.configuration.CodecConfigurationException: Can't find a codec for class Item. 问题是,我为类项创建了编解码器,但它甚至无法注册。请参阅课程以获得最佳理解 模型 public class Card(){ public Card(){ itens = new A
org.bson.codecs.configuration.CodecConfigurationException: Can't find a codec for class Item.
问题是,我为类项创建了编解码器,但它甚至无法注册。请参阅课程以获得最佳理解
模型
public class Card(){
public Card(){
itens = new ArrayList<Item>()
}
String id;
String description;
List<Item> itens;
.
.
.
}
卡片编解码器
public class CardCodec implements CollectibleCodec<Card>{
private final Codec<Document> documentCodec;
public CardCodec() {
this.documentCodec = new DocumentCodec();
}
@Override
public void encode(BsonWriter writer, Card card, EncoderContext encoderContext) {
Document cardDoc = new Document();
String id = card.getId();
String description = card.getDescription();
List<Item> itens = card.getItens();
if(id != null) {
cardDoc.put("_id", new ObjectId(id));
}
if(description != null){
cardDoc.put("description", card.getDescription);
}
if(Itens != null){
cardDoc.put("itens", card.getItens());
}
this.documentCodec.encode(writer, cardDoc, encoderContext);
}
@Override
public Class<Card> getEncoderClass() {
return Card.class;
}
@Override
public Card decode(BsonReader reader, DecoderContext decoderContext) {
Document cardDoc = this.documentCodec.decode(reader, decoderContext);
Card card= new Card();
card.setId(cardDoc .getObjectId("_id").toHexString());
card.setDescription(cardDoc .getString("description"));
List<Document> itensDoc = cardDoc.getList("itens", Document.class);
List<Item> itens = new ItemConverter().convertToListItem(itensDoc);
card.setItens(itens);
return card;
}
@Override
public Card generateIdIfAbsentFromDocument(Card card) {
if( !documentHasId(card) ) {
card.setId(new ObjectId().toHexString());
}
return card;
}
@Override
public boolean documentHasId(Card card) {
return null != card.getId();
}
@Override
public BsonValue getDocumentId(Card card) {
if(!documentHasId(card)) {
throw new IllegalStateException("Esse documento não tem um _id");
}
return new BsonString(card.getId());
}
}
当我尝试执行插入时:
this.cardCollection.insertOne(card);
我收到:
org.bson.codecs.configuration.CodecConfigurationException
手工编写正确有效的POJO编解码器实现是一件棘手的事情。在这种情况下,问题在于您在CardCodec中实例化的DocumentCodec未配置包含ItemCodec的CodecRegistry,因此无法找到ItemCodec 有很多方法可以修复编解码器的实现,但我不清楚当驱动程序有一个通用的解决方案时,为什么要自己动手。有关详细信息,请参阅 只需按如下方式创建您的CodecRegistry:
CodecRegistry codecRegistry = CodecRegistries.fromRegistries(
MongoClientSettings.getDefaultCodecRegistry(),
CodecRegistries.fromProviders(PojoCodecProvider.builder().automatic(true).build())
);
手工编写正确有效的POJO编解码器实现是一件棘手的事情。在这种情况下,问题在于您在CardCodec中实例化的DocumentCodec未配置包含ItemCodec的CodecRegistry,因此无法找到ItemCodec 有很多方法可以修复编解码器的实现,但我不清楚当驱动程序有一个通用的解决方案时,为什么要自己动手。有关详细信息,请参阅 只需按如下方式创建您的CodecRegistry:
CodecRegistry codecRegistry = CodecRegistries.fromRegistries(
MongoClientSettings.getDefaultCodecRegistry(),
CodecRegistries.fromProviders(PojoCodecProvider.builder().automatic(true).build())
);
非常感谢,但只是想澄清一下:为什么数组中没有项时代码会工作?在这种情况下,即使使用空的Items子文档,insertOne也能正确写入。仅当Items数组中存在元素时才会引发异常。因为DocumentCodec仅在实际需要时才尝试查找编解码器。如果阵列为空,则不需要。谢谢,但是,上面的解决方案也报告了一个异常。ID是字符串。。。org.bson.codecs.configuration.CodecConfigurationException:使用AutomaticPojoDec进行解码时发生异常。解码为“卡”失败,出现以下异常:解码“卡”失败。解码“\u id”时出错:readString只能在CurrentBSONType为STRING时调用,而不能在CurrentBSONType为OBJECT\u id时调用。可能需要显式配置和注册自定义编解码器或PojoCodec以处理此类型@塔尔西奥罗莎我也犯了同样的错误。因此,我通过添加
@BsonId private ObjectId idCheck解决了这个问题代码>到我的班级。当它试图映射mongo对象_id时发生此异常。因此,只要将其添加到模型类中,它就应该解决此问题。非常感谢,但只是想澄清一下:当数组中没有项时,代码为什么工作?在这种情况下,即使使用空的Items子文档,insertOne也能正确写入。仅当Items数组中存在元素时才会引发异常。因为DocumentCodec仅在实际需要时才尝试查找编解码器。如果阵列为空,则不需要。谢谢,但是,上面的解决方案也报告了一个异常。ID是字符串。。。org.bson.codecs.configuration.CodecConfigurationException:使用AutomaticPojoDec进行解码时发生异常。解码为“卡”失败,出现以下异常:解码“卡”失败。解码“\u id”时出错:readString只能在CurrentBSONType为STRING时调用,而不能在CurrentBSONType为OBJECT\u id时调用。可能需要显式配置和注册自定义编解码器或PojoCodec以处理此类型@塔尔西奥罗莎我也犯了同样的错误。因此,我通过添加@BsonId private ObjectId idCheck解决了这个问题代码>到我的班级。当它试图映射mongo对象id时发生此异常。因此,只需将其添加到模型类中,它就可以解决此问题。
this.cardCollection.insertOne(card);
org.bson.codecs.configuration.CodecConfigurationException
CodecRegistry codecRegistry = CodecRegistries.fromRegistries(
MongoClientSettings.getDefaultCodecRegistry(),
CodecRegistries.fromProviders(PojoCodecProvider.builder().automatic(true).build())
);