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

2022-09-01 15:52:33

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

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

答案 1

从您尝试执行的操作的外观来看,您正在尝试添加一些自定义数据类型(在本例中为POJO),但您需要记住的是,文档中的字段只能接受某些数据类型,而不能直接接受对象。

如果您也不知道,Mongo文档的结构与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));

我希望这能回答你的问题,并为你工作。


答案 2

您需要将代码注册表配置为使用 PojoCodecProvider,如下所述:http://mongodb.github.io/mongo-java-driver/3.7/driver/getting-started/quick-start-pojo/