web-dev-qa-db-ja.com

MongoDB Java Inserting Throws org.bson.codecs.configuration.CodecConfigurationException:クラスio.github.ilkgunel.mongodb.Pojoのコーデックが見つかりません

JavaでMongoDBを学んでいます。 Javaドライバを使用してMongoDBにデータを挿入しようとしています。MongoDBチュートリアルのように挿入を行っていますが、すべてが大丈夫です。コード、ドライバーは次のようなエラーをスローします:

org.bson.codecs.configuration.CodecConfigurationException: Can't find a codec for class io.github.ilkgunel.mongodb.Pojo.

このようにStack Overflowで質問を探しましたが、何も理解できず、このエラーを解決するものが見つかりません。私のコードは以下です。この問題をどのように解決できますか?

私はこのコードを使用しています:

package io.github.ilkgunel.mongodb;
import org.bson.Document;

import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;

import Java.text.DateFormat;
import Java.text.SimpleDateFormat;
import Java.util.ArrayList;
import Java.util.Collection;
import Java.util.List;
import Java.util.Locale;

public class MongoDBBasicUsage {
    public static void main(String[] args) {
        MongoClient mongoClient;
        try {
            Pojo pojo = new Pojo();
            mongoClient = new MongoClient("localhost", 27017);
            MongoDatabase database = mongoClient.getDatabase("MongoDB");

            pojo.setId("1");
            pojo.setName("ilkay");
            pojo.setSurname("günel");

            Document document = new Document();
            document.put("person", pojo);

            database.getCollection("Records").insertOne(document);  
        } catch (Exception e) {
            System.err.println("Bir Hata Meydana Geldi!");
            System.out.println("Hata" + e);
        }
    }
}

私のポージョはこれです:

    package io.github.ilkgunel.mongodb;

public class Pojo {
    String name;
    String surname;
    String id;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSurname() {
        return surname;
    }

    public void setSurname(String surname) {
        this.surname = surname;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    } 
}
13
İlkay Gunel

あなたがやろうとしていることの外観から、カスタムデータ型(この場合はPOJO)を追加しようとしていますが、ドキュメントのフィールドはオブジェクトではなく特定のデータ型のみを受け入れることができることに留意する必要があります。

あなたも知らなかった場合、Mongo Documentsはjsonと同じ方法で構造化されます。そのため、フィールドを作成して値を挿入することにより、明示的にドキュメントを作成する必要があります。値フィールドで許可される特定のデータ型があります。

http://mongodb.github.io/mongo-Java-driver/3.0/bson/documents/

あなたのケースを助けるために、以下のコードはPOJOをパラメータとして受け取り、POJOの構造を知って、コレクションに挿入できるMongoドキュメントを返します:

private Document pojoToDoc(Pojo pojo){
    Document doc = new Document();

    doc.put("Name",pojo.getName());
    doc.put("Surname",pojo.getSurname());
    doc.put("id",pojo.getId());

    return doc;
} 

これは挿入のために動作するはずです。フィールドの1つにインデックスを付ける場合:

database.getCollection("Records").createIndex(new Document("id", 1));

これがあなたの質問に答え、あなたのために働くことを願っています。

12
Dallas Phillips

ここで説明したように、PojoCodecProviderを使用するようにCodeRegistryを構成する必要があります。 http://mongodb.github.io/mongo-Java-driver/3.7/driver/getting-started/quick-start-pojo/ =

5
Renato Oliveira

少し抽象的にすると、他の開発者の時間を節約できます。
このエラー:CodecConfigurationException:クラスxxxのコーデックが見つかりませんは、mongoドライバーが、そのxxxクラスで作成したオブジェクトで送信したデータを処理できないことを意味します。したがって、必要なmongoクエリを生成できません。

その場合の解決策は、正しいクラスを使用すること、つまり、ドライバーが期待するクラスの1つを使用することです(私の場合、Java配列をArrayListオブジェクトに置き換えると、問題)..他の解決策は、ドライバーをアップグレードすることである可能性があります。
hth

2
Hasnaa Ibraheem