我是全新的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)
您不能简单地用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)
并将其写入数据库。
尝试使用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>");
以下是对这个问题的详细分析:-
看起来"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和它的创建。