MongoDB Java插入引发org.bson.codecs.configuration.CodecConfigurationException:无法找到类io.github.ilkgunel.mongodb.Pojo的编解码器

问题描述 投票:11回答:4

我正在用Java学习MongoDB。我正在尝试使用Java驱动程序将数据插入MongoDB。我正在插入像MongoDB教程一样,每件事都很好。但是,如果我想插入一个变量,当我运行代码时,驱动程序会抛出这样的错误:

org.bson.codecs.configuration.CodecConfigurationException: Can't find a codec for class io.github.ilkgunel.mongodb.Pojo.

我在Stack Overflow中解决了这样的问题,但我无法理解任何事情,我找不到任何解决此错误的方法。我的代码如下。怎么能解决这个问题?

我正在使用此代码:

package io.github.ilkgunel.mongodb;
import org.bson.Document;

import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Locale;

public class MongoDBBasicUsage {
    public static void main(String[] args) {
        MongoClient mongoClient;
        try {
            Pojo pojo = new Pojo();
            mongoClient = new MongoClient("localhost", 27017);
            MongoDatabase database = mongoClient.getDatabase("MongoDB");

            pojo.setId("1");
            pojo.setName("ilkay");
            pojo.setSurname("günel");

            Document document = new Document();
            document.put("person", pojo);

            database.getCollection("Records").insertOne(document);  
        } catch (Exception e) {
            System.err.println("Bir Hata Meydana Geldi!");
            System.out.println("Hata" + e);
        }
    }
}

我的Pojo是这样的:

    package io.github.ilkgunel.mongodb;

public class Pojo {
    String name;
    String surname;
    String id;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSurname() {
        return surname;
    }

    public void setSurname(String surname) {
        this.surname = surname;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    } 
}
java mongodb
4个回答
12
投票

从你想要做的事情来看,你正试图添加一些自定义数据类型(在这种情况下你的POJO),但你需要记住的是文档中的字段只能接受某些数据类型,而不是直接接受对象。

如果你也不知道,Mongo Documents的结构与json相同。因此,您必须通过创建字段并将值插入其中来明确地创建文档。值字段中允许使用特定数据类型:

http://mongodb.github.io/mongo-java-driver/3.0/bson/documents/

为了帮助解决您的问题,下面的代码将您的POJO作为参数并了解POJO的结构,返回可插入到您的集合中的Mongo文档:

private Document pojoToDoc(Pojo pojo){
    Document doc = new Document();

    doc.put("Name",pojo.getName());
    doc.put("Surname",pojo.getSurname());
    doc.put("id",pojo.getId());

    return doc;
} 

这应该适用于插入。如果要索引其中一个字段:

database.getCollection("Records").createIndex(new Document("id", 1));

我希望这能回答你的问题并为你效劳。


5
投票

您需要配置CodeRegistry以使用PojoCodecProvider,如下所述:http://mongodb.github.io/mongo-java-driver/3.7/driver/getting-started/quick-start-pojo/


1
投票

有点抽象,因为这可能为其他开发人员节省一天.. 此错误:CodecConfigurationException:找不到类xxx的编解码器意味着您的mongo驱动程序无法处理您在该xxx类所构成的对象中发送的数据,因此无法生成所需的mongo查询。 在这种情况下的解决方案是使用正确的类,即使用驱动程序之一的预期类(在我的情况下,通过ArrayList对象替换java数组解决了问题)..另一个解决方案可能是升级你的驱动程序。 @Renato可以提到第三种解决方案来定义您自己的解码逻辑。这取决于您的具体情况。 心连心


-2
投票

你检查了mongodb的库吗?我在今天早上通过将mongodb java驱动程序从3.2.2更改为3.4.2来解决这个问题。这样的新maven:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
    <version>1.5.4.RELEASE</version>
</dependency>

尝试和回应

© www.soinside.com 2019 - 2024. All rights reserved.