找不到我班

时间:2017-11-02 05:06:45

标签: 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;
    }
}

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

我检查过类似的问题here,但插入代码不同。我从答案中提取了提示并修改了我的方法,但它看起来并不干净。修改方法如下:

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

    }

4 个答案:

答案 0 :(得分:1)

按照POJO快速入门指南进行操作。您需要注册编解码器以将POJO(Plain Old Java Object)转换为BSON或从BSON转换: http://mongodb.github.io/mongo-java-driver/3.7/driver/getting-started/quick-start-pojo/

答案 1 :(得分:1)

文档: MongoDB Driver Quick Start - POJOs

遵循上述文档后,如果仍然出现错误,则

您可能会在馆藏之类的内部使用通用文档,例如

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 地图

mkyong来救援。

对于抓取,它可以按预期工作,但是您可能希望将其从Map转换为POJO作为后期处理步骤,我们可以找到一些不错的答案here

希望有帮助! ?️

答案 2 :(得分:0)

您是否注释了您的Java类?看起来您需要在您的班级上方使用@Entity,并且在您的ID字段上方需要@Id。

答案 3 :(得分:0)

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

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 driver documentation还包含有关管理pojos的文章(该链接适用于3.8.0驱动程序版本)。