无法在 MongoDB 中创建实体
Can´t create entity in MongoDB
我是 MongoDB 的新手,很抱歉,如果问题很基础。
我正在尝试使用 Java 基本对象 (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)
您不能简单地将应用程序中的每个 class 序列化为 mongo java 驱动程序。要么,你坚持使用 JSON 文档及其支持的数据类型(基本上是字符串、各种数字、布尔值、日期),要么你实际上为你的 class 编写自定义编解码器,以便内部 Bson 转换可以工作有了它。
只有 link 不幸的是,我在德语中发现了一个基本示例: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,详见此问题的答案:Converting Java objects to JSON with Jackson
获得 JSON 字符串后,您可以通过
将其转换为 org.bson.Document
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" 方法没有生成。当我 运行 main class 时出现序列化错误。我已经反编译了 classes User 和 NormalUser 并检查了内容。它没有 "getter" 和 "setter" 方法。
2) Maven 行为:-
我已经使用 maven 命令来构建项目并检查了 classes User 和 NormalUser。这次我可以看到正在生成的样板代码。我已经执行了 Main class 并且运行良好。
解法:-
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>
输出:-
文档已成功插入 Mongo数据库集合。
{
"_id" : ObjectId("57d2e4134c1c7b287cde1d30"),
"user" : {
"surname" : "mike",
"address" : "US",
"dni" : "dni",
"bankAccount" : "123",
"admin" : false,
"name" : "jack",
"gender" : "MALE"
}
}
我是 MongoDB 的新手,很抱歉,如果问题很基础。
我正在尝试使用 Java 基本对象 (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)
您不能简单地将应用程序中的每个 class 序列化为 mongo java 驱动程序。要么,你坚持使用 JSON 文档及其支持的数据类型(基本上是字符串、各种数字、布尔值、日期),要么你实际上为你的 class 编写自定义编解码器,以便内部 Bson 转换可以工作有了它。
只有 link 不幸的是,我在德语中发现了一个基本示例: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,详见此问题的答案:Converting Java objects to JSON with Jackson
获得 JSON 字符串后,您可以通过
将其转换为 org.bson.Documentorg.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" 方法没有生成。当我 运行 main class 时出现序列化错误。我已经反编译了 classes User 和 NormalUser 并检查了内容。它没有 "getter" 和 "setter" 方法。
2) Maven 行为:-
我已经使用 maven 命令来构建项目并检查了 classes User 和 NormalUser。这次我可以看到正在生成的样板代码。我已经执行了 Main class 并且运行良好。
解法:-
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>
输出:-
文档已成功插入 Mongo数据库集合。
{
"_id" : ObjectId("57d2e4134c1c7b287cde1d30"),
"user" : {
"surname" : "mike",
"address" : "US",
"dni" : "dni",
"bankAccount" : "123",
"admin" : false,
"name" : "jack",
"gender" : "MALE"
}
}