Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Can';找不到我的类的编解码器(CodeConfigurationException)_Java_Mongodb_Codec_Mongo Java Driver - Fatal编程技术网

Java Can';找不到我的类的编解码器(CodeConfigurationException)

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

我需要在mongodb数据库中保存一个java对象。此对象中有另一个对象。当我尝试保存时,我在控制台上收到错误消息:

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