簡體   English   中英

找不到適合我的課程的編解碼器

[英]Can't find a codec for my class

我有一個名為 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;
        }

    }

您需要配置一個CodecRegistry來管理從 bson 到您的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 驅動程序文檔還包含一篇關於管理pojos的文章(該鏈接適用於 3.8.0 驅動程序版本)。

文檔: MongoDB 驅動程序快速入門 - POJO

按照上述文檔操作后,如果仍然出現錯誤,則

您可以在您的收藏中使用通用文檔,例如

class DocStore {
  String docId:
  String docType;
  Object document; // this will cause the BSON cast to throw a codec error
  Map<String, Object> document; // this won't
}

而且,您仍然希望將文檔從POJO 轉換Map

mkyong來救援。

至於獲取,它按預期工作,但您可能希望從 Map 轉換到您的 POJO 作為后處理步驟,我們可以在這里找到一些好的答案

希望能幫助到你! 🙂️

你有沒有注釋你的 Java 類? 看起來您需要在類上方使用 @Entity ,在 ID 字段上方使用 @Id 。

按照 POJO 的快速入門指南進行操作。 您需要注冊編解碼器才能將您的 POJO(Plain Old Java Object)翻譯成/從 BSON: http : //mongodb.github.io/mongo-java-driver/3.7/driver/getting-started/quick-開始-pojo/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM