0

私は MongoDB と Mongojack を初めて使用します。ドキュメントが既に終了している場合はドキュメントを更新するか、新しいドキュメントを挿入しようとしています。テスト目的で、ボタンクリックイベントである以下のコードを使用します。私の問題は、ボタンを初めてクリックすると、生成されたオブジェクト ID を持つドキュメントが追加されますが、もう一度クリックすると、同じオブジェクト ID を持つ別のドキュメントが追加されます。毎回更新することで、このコレクションに 1 つのドキュメントのみを保持することを期待しています。

グーグルで検索した後@objectId、フィールドに注釈を追加し_idましたが、以下の根本原因でエラーが発生します。

何か助けて..

モデルクラス

public class Transport implements StockLoadable {
    // @ObjectId 
private String _id;
private String info;

public String getInfo() {
    return info;
}

public void setInfo(String info) {
    this.info = info;
}


public String get_id() {
    return _id;
}


public void set_id(String _id) {
    this._id = _id;
}

@Override
public String toString() {
    return "Vehicle";
}

@Override
public void setStock(Stock stock) {
    // TODO Auto-generated method stub

}

@Override
public Stock getStock() {
    // TODO Auto-generated method stub
    return null;
}

}

ボタンクリックイベント

Transport transport;
btn.addClickListener(o->{
        if(transport==null){
        transport= new Transport();
        transport.setInfo("Info");
        }
        try (MongoClient mongoClient = new MongoClient("localhost",27017)) {
            DB db = mongoClient.getDB("transport");
            DBCollection table = db.getCollection("test");
            JacksonDBCollection<Transport, String> collection = JacksonDBCollection.wrap(table, Transport.class, String.class);
            WriteResult<Transport, String> result = collection.save(transport);
            System.out.println(result.getSavedId());
            transport= collection.findOne(DBQuery.is("_id",result.getSavedId()));
        } catch (Exception e) {
            e.printStackTrace();
        }
    });

注釈を追加した後に発生するルート例外

Caused by: java.lang.NoSuchMethodError: com.fasterxml.jackson.databind.introspect.Annotated.getType()Lcom/fasterxml/jackson/databind/JavaType;
at org.mongojack.internal.MongoAnnotationIntrospector.findDeserializer(MongoAnnotationIntrospector.java:86)
at com.fasterxml.jackson.databind.introspect.AnnotationIntrospectorPair.findDeserializer(AnnotationIntrospectorPair.java:515)
at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory.findDeserializerFromAnnotation(BasicDeserializerFactory.java:1648)
at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.constructSettableProperty(BeanDeserializerFactory.java:721)
at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.addBeanProps(BeanDeserializerFactory.java:498)
4

1 に答える 1

1

私は自分の質問に答えています。これは他の人に役立つかもしれません。ドキュメントを複製する理由は、mongodb の自動 ID プロセスに関する私の誤解です。

データベースにドキュメントの ID を発行させる必要がある場合はorg.bson.types.ObjectId 、フィールドのタイプを名前とともに使用し、_id空のままにしておく必要があります。選択した ID を追加する場合は、名前で必要なタイプのフィールドを定義し、_idそれに適切な値を割り当てます。空のままにすると、mongo は type の id を追加し、ObjectId結果として問題が発生します。

_idフィールドのタイプを から 問題によって解決された に変更しStringますObjectId。しかし、例外の理由を見つけることができませんでした。注釈も削除しました。

于 2016-09-27T18:51:05.407 に答える