【问题标题】:Can't find a codec for my class找不到适合我的班级的编解码器
【发布时间】:2018-04-14 13:02:58
【问题描述】:

我有一个名为 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;
        }

    }

【问题讨论】:

  • 您可以尝试为模型定义您的自定义Codec
  • @nullpointer 我还没有为 pojo 类编写编解码器。请您指出正确的方向吗?
  • 这是一个提示,我相信你知道你可以尝试,如果那里不起作用,回到 SO ;)

标签: java mongodb morphia


【解决方案1】:

您是否为您的 Java 类添加了注解?看起来你需要在你的班级上方有一个@Entity,在你的 ID 字段上方有一个@Id。

【讨论】:

  • 我故意没有注释,因为根据我的架构/逻辑,“信号”在技术上不是一个实体。
  • 但是你把它和 Morphia 一起保存为一个实体,它是一个集合的顶级表示,所以它在这个上下文中是一个实体
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    您需要配置一个 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驱动版本)。

    【讨论】:

      【解决方案4】:

      文档: 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

      希望对您有所帮助! ?️

      【讨论】:

        猜你喜欢
        • 2014-06-18
        • 1970-01-01
        • 1970-01-01
        • 2016-06-01
        • 2013-09-17
        • 2013-10-14
        • 1970-01-01
        • 2013-05-26
        相关资源
        最近更新 更多