web-dev-qa-db-ja.com

クラスのコーデックが見つかりません

Signalという名前の単純なクラスがあります。クラスは次のようになります。

public class Signal {
    private String id;
    private Date timestamp;

    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public Date getTimestamp() {
        return timestamp;
    }
    public void setTimestamp(Date timestamp) {
        this.timestamp = timestamp;
    }
}

MongoDB(v3.4)にシグナルを挿入しようとしています。私は次の方法を使用して挿入しています:

public boolean xyz(Signal signal) {
            try {
                DatabaseConnection databaseConnection =DatabaseConnection.getInstance();
                MongoClient mongoClient = databaseConnection.getMongoClient();
                MongoDatabase db = mongoClient.getDatabase("myDb"); 
                MongoCollection<Signal> collection = db.getCollection("myCollection", Signal.class);
                collection.insertOne(signal);

                return true;
            } catch (Exception e){
                logger.error("Error", e);
                return false;
            }

        }

次の例外が発生します。

org.bson.codecs.configuration.CodecConfigurationException:クラスin.co.mysite.webapi.models.Signalのコーデックが見つかりません。

同様の質問を確認しました ここ ですが、挿入コードが異なります。私は答えからヒントを得て、私の方法を修正しましたが、それはきれいに見えません。変更された方法は次のとおりです。

public boolean xyz(Signal signal) {
        try {
            DatabaseConnection databaseConnection =DatabaseConnection.getInstance();
            MongoClient mongoClient = databaseConnection.getMongoClient();
            MongoDatabase db = mongoClient.getDatabase("myDb"); 
            MongoCollection<Document> collection = db.getCollection("myCollection");

            Document doc = new Document();

            doc.put("id", signal.getId());
            doc.put("timestamp", signal.getTimestamp());
            doc.put("_id", new ObjectId().toString());

            collection.insertOne(doc);

            return true;
        } catch (Exception e){
            logger.error("Error", e);
            return false;
        }

    }
5
Darshan Puranik

Bsonからpojoへの変換を管理するCodecRegistryを構成する必要があります。

MongoClientURI connectionString = new MongoClientURI("mongodb://localhost:27017");
        MongoClient mongoClient = new MongoClient(connectionString);
        CodecRegistry pojoCodecRegistry = org.bson.codecs.configuration.CodecRegistries.fromRegistries(MongoClientSettings.getDefaultCodecRegistry(), org.bson.codecs.configuration.CodecRegistries.fromProviders(PojoCodecProvider.builder().automatic(true).build()));
        MongoDatabase database = mongoClient.getDatabase("testdb").withCodecRegistry(pojoCodecRegistry);  

PS:org.bson.codecs.configuration.CodecRegistries.fromRegistriesorg.bson.codecs.configuration.CodecRegistries.fromProvidersを静的にインポートできます。

完全な例は github にあります。
Mongodb Javaドライバーのドキュメント には、pojoの管理に関する記事も含まれています(リンクは3.8.0ドライバーバージョン用です)。

2
M3HD1
1
Renato Oliveira

Javaクラスに注釈を付けましたか?クラスの上に@Entityが必要で、IDフィールドの上に@Idが必要なようです。

0
Nic Cottrell