当前位置: 首页 > 知识库问答 >
问题:

无法在MongoDB中创建实体

巫马劲
2023-03-14

我是全新的MongoDB,所以很抱歉,如果这个问题是基本的。

我试图获得一个使用Java basic对象(POJO)的基本CRUD,但这段代码失败了。(正确的方法是什么?我认为可能接近这个):

BasicDBObject document = new BasicDBObject();
document.put("name", user);
dbCollection.insert(document);

这是我得到的信息:

Exception in thread "main" java.lang.IllegalArgumentException: can't serialize class entities.users.NormalUser
    at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:270)
    at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:174)
    at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:120)
    at com.mongodb.DefaultDBEncoder.writeObject(DefaultDBEncoder.java:27)
    at com.mongodb.OutMessage.putObject(OutMessage.java:289)
    at com.mongodb.DBApiLayer$MyCollection.insert(DBApiLayer.java:261)
    at com.mongodb.DBApiLayer$MyCollection.insert(DBApiLayer.java:226)
    at com.mongodb.DBCollection.insert(DBCollection.java:75)
    at com.mongodb.DBCollection.insert(DBCollection.java:59)
    at com.mongodb.DBCollection.insert(DBCollection.java:104)
    at repositories.UsersRepository.createUser(UsersRepository.java:53)
    at repositories.UsersRepository.main(UsersRepository.java:90)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

共有3个答案

米俊晤
2023-03-14

您不能简单地用mongo java驱动程序序列化应用程序中的每个类。要么,您坚持使用JSON文档及其支持的数据类型(基本上是字符串、各种数字、布尔值、日期),要么实际上为您的类编写一个自定义编解码器,以便内部Bson转换可以使用它。

不幸的是,我找到了一个德语基本例子的唯一链接:https://dev-tek.de/lexicon/Entry/64-MongoDB-Anleitung-Custom-codecs-mit-Hilfe-des-DocumentCodecs/-但也许代码有助于理解。

附录,关于评论:

基本上,您可以自己手动执行以下转换:

Document doc = new org.bson.Document();
doc.put("userName", user.getName());
doc.put("userId", user.getID());
// ... or whatever your user object looks like
// and then:
dbCollection.insert(doc);

然后,您可以尝试使用外部编码库将您的对象转换为JSON,例如Jackson,详细内容见本问题的答案:使用Jackson将Java对象转换为JSON

一旦有了JSON字符串,就可以将其转换为组织。布森。文件通过

org.bson.Document.parse(jsonString)

并将其写入数据库。

孟选
2023-03-14

尝试使用MongoTemplate。使用此模板将java对象保存在mongodb中,它将以文档形式创建。

https://www.mkyong.com/mongodb/spring-data-mongodb-insert-document/

实例

MongoTemplate mongoTemplate = new MongoTemplate(new MongoClient("<server>"),"<db name>");

User user = new NormalUser();
mongoTemplate.save(user, "<collection>");
宗穆冉
2023-03-14

以下是对这个问题的详细分析:-

看起来"lombok"库在编译时添加了样板代码(即getter和setter方法的属性)。我在执行程序时观察到两种行为。

1) Eclipse行为:-

当我通过IDE(例如eclipse)运行程序时,“getter”和“setter”方法没有生成。运行主类时出现序列化错误。我已经反编译了User和NormalUser类,并检查了内容。它没有“getter”和“setter”方法。

在线Java反编译器

2)Maven行为:-

我已经使用maven命令来构建项目,并检查了User和NormalUser类。这次我可以看到样板代码正在生成。我已经执行了我的Main类,它工作得很好。

解决方案:-

MongoClient client = new MongoClient();
        MongoDatabase database = client.getDatabase("localhost");
        MongoCollection<Document> normalUserCollection = database.getCollection("normaluser");

        User normalUser = new NormalUser("jack", "mike", "US", "dni", "123", Gender.MALE);

        Document document = new Document();
        document.put("user", document.parse(new ObjectMapper().writeValueAsString(normalUser)));

使用的Mongo Java驱动程序:-

<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongo-java-driver</artifactId>
    <version>3.2.2</version>
</dependency>
<dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.7.5</version>
        </dependency>

输出:-

文档已成功插入MongoDB集合中。

{
    "_id" : ObjectId("57d2e4134c1c7b287cde1d30"),
    "user" : {
        "surname" : "mike",
        "address" : "US",
        "dni" : "dni",
        "bankAccount" : "123",
        "admin" : false,
        "name" : "jack",
        "gender" : "MALE"
    }
}
 类似资料:
  • 我一直在尝试在我的MSDN Azure订阅中创建一个spot实例标准D2s v3(2 vCPU,8 GiB内存)VM。我试过EastUS、EastUS 2和WestUS地区,结果都是一样的。 资源/订阅/xxxxx/resourceGroup/dnd/提供者/Microsoft的请求大小。计算/虚拟机/windowsvm'目前无法在位置'eastus2'区域"中订阅'xxxxx'。请尝试其他大小或

  • 我试着使用设置并查看了所有选项,但“OK”按钮无法让我完成这个过程。知道吗? 更新:确定按钮现在启用,但填写完所有内容后,我按下确定,我在控制台收到一个不同的错误: [2013-07-22 11:04:45-SDK Manager]错误:null] 访问问题:Android SDK AVD错误:null

  • 我试图在Neo4j中插入两个节点之间的关系。我正在使用Neo4J(2.1.8社区) 我正在使用尝试创建员工经理关系。此关系实体是报表。(两个类都在下面给出) 但当我试图挽救这段感情的时候 我得到了例外作为 线程“main”组织中出现异常。springframework。刀。DataRetrievalFailureException:关系[0]没有propertyKey=“type”的属性。;嵌套的

  • 循环在具有特定键值对的文本文件上运行三次。每个循环都会返回一个新的散列,如下所示。我想将这些散列存储到另一个散列中。,和是散列的关键: 我将上述散列初始化为而不是我想将它们存储到散列中。我想初始化更大的散列,比如。 但它只给了我

  • 我有这样一个问题: /SQLITELOG:(1)表ds_sinhvien没有名为id的列 我不知道如何修复这个,这是我的dbhelper: 谢谢你帮我,我已经修了很长时间了。

  • 你好,我是android中MVVM的新手,正在使用livedata。我正在尝试创建viewmodel的一个实例。我觉得问题在于我没有将存储库传递给viewmodel构造函数。我一直无法创建viewmodel的实例。我不知道该怎么做这里是我的viewmodel和它的创建。