找不到适合我的课程的编解码器

Dar*_*nik 7 java mongodb morphia

我有一个名为 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试在 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;
            }

        }
Run Code Online (Sandbox Code Playgroud)

我收到以下异常:

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;
        }

    }
Run Code Online (Sandbox Code Playgroud)

M3H*_*HD1 5

您需要配置一个CodecRegistry来管理从 bson 到您的 pojo 的翻译:

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);  
Run Code Online (Sandbox Code Playgroud)

PS:您可以静态导入org.bson.codecs.configuration.CodecRegistries.fromRegistriesorg.bson.codecs.configuration.CodecRegistries.fromProviders.

一个完整的例子可以在github 中找到。
MongoDB的Java驱动程序文件还包含有关管理的POJO(链接是3.8.0驱动程序版本)的文章。


Nic*_*ell 1

你的Java类有注释吗?看起来您需要在类上方添加一个 @Entity ,在 ID 字段上方添加一个 @Id 。