【问题标题】:Storing a values with ArrayList<Model> to MongoDB in Java使用 ArrayList<Model> 将值存储到 Java 中的 MongoDB
【发布时间】:2014-01-30 09:49:09
【问题描述】:

在我的 Java Play 框架应用程序中,我想将 ArrayList 值存储在 mongoDB 中。

我在 JSON 中有 3 个值,即 loginid、电话、学生;在那个学生中是 ArrayList。我将数据存储在 mongoDB 中,如下所示:

{  "loginid" : "user@mail.com", "phone" : "0123456789", "students" : [{"firstName" : "Jesse", "lastName" : "Varnell", "age" : "15", "gender" : "M" }, { "firstName" : "John", "lastName" : "Doe", "age" : "13", "gender" : "F"}] }

我正在使用 mongo 查询来存储以下值:

BasicDBObject searchQuery = new BasicDBObject();
BasicDBObject theUserObj = new BasicDBObject();

ArrayList<Student> student = new ArrayList<Student>();
if(studentArray != null && studentArray.size()>=0) {
    Student stud = new Student();
    for(int i = 0; i < studentArray.size(); i++){
        stud = studentArray.get(i);
        student.add(stud);
    }   
}
theUserObj.put("loginid", profile.loginid);
theUserObj.put("phone", profile.phone);
searchQuery.append("loginid", username);
theUserObj.put("students", student);

theUserCollection.update(searchQuery, theUserObj); //Got error on this line.

我收到以下错误:

Execution exception (In /app/controllers/StudentInfo.java around line 176)
IllegalArgumentException occured : can't serialize class models.Student

play.exceptions.JavaExecutionException: can't serialize class models.Student
    at play.mvc.ActionInvoker.invoke(ActionInvoker.java:237)
    at Invocation.HTTP Request(Play!)
Caused by: java.lang.IllegalArgumentException: can't serialize class models.Student
    at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:234)
    at org.bson.BasicBSONEncoder.putIterable(BasicBSONEncoder.java:259)
    at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:198)
    at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:140)
    at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:86)
    at com.mongodb.DefaultDBEncoder.writeObject(DefaultDBEncoder.java:27)
    at com.mongodb.OutMessage.putObject(OutMessage.java:142)
    at com.mongodb.DBApiLayer$MyCollection.update(DBApiLayer.java:346)
    at com.mongodb.DBCollection.update(DBCollection.java:165)
    at com.mongodb.DBCollection.update(DBCollection.java:197)
    at com.mongodb.DBCollection.update(DBCollection.java:209)
    at controllers.StudentInfo.doStoreProfile(StudentInfo.java:176)
    at controllers.StudentInfo.storeUserProfile(StudentInfo.java:212)
    at play.mvc.ActionInvoker.invokeWithContinuation(ActionInvoker.java:557)
    at play.mvc.ActionInvoker.invoke(ActionInvoker.java:508)
    at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:484)
    at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:479)
    at play.mvc.ActionInvoker.invoke(ActionInvoker.java:161)

如何使用 Java 在 MongoDB 中使用 ArrayList 存储值?

【问题讨论】:

  • 你的Student 类实现了Serializable 吗?
  • 没有。它是 Model in Play 框架之一。
  • 你能编辑这个类吗?尝试使其实现 Serializable/
  • 是的。让我现在试试。
  • 试过了,还是一样的错误。

标签: java mongodb arraylist playframework


【解决方案1】:

DBObject 和实现类只能处理 BSON 类型,而 Student 类不能。

有很多框架可以映射 |将域对象(例如 Student)转换为 |来自 BSON 的陈述和文件。由于您显然没有使用任何内容,因此您必须自己手动将每个 Student 转换为 DBObject

BasicDBObject searchQuery = new BasicDBObject("loginid", username);
BasicDBObject theUserObj = new BasicDBObject();

List<Object> studentsDBList = new BasicDBList();

for (Student student : studentArray) {
    DBObject studentDBObject = new BasicDBObject();
    studentDBObject.put("firstName", student.getFirstName());
    studentDBObject.put("lastName", student.getLastName());
    studentDBObject.put("age", student.getAge());
    studentDBObject.put("gender", student.getGender());
    studentsDBList.add(studentDBObject);
} 

theUserObj.put("phone", profile.phone);
theUserObj.put("students", studentsDBList);

theUserCollection.update(searchQuery, theUserObj); 

另外,请注意,您不必将loginid 放入theUserObj,因为您只是在查询它

【讨论】:

  • 你好 Ori,你怎么能反过来呢?将 MongoDb 值作为数组列表获取
  • 按照上面的例子:List&lt;Object&gt; aList = (List&lt;Object&gt;) theUserObj.get("students")get 方法返回一个 BasicDBList,它继承自 ArrayList
【解决方案2】:

您正在尝试将一个普通的 JAVA 对象添加到 MongoDB 中。

ArrayList<Student> student = new ArrayList<Student>();
theUserObj.put("students", student);

在上面的 stmt 中,你试图将学生 ArrayList 对象放入 MongoDB 数组中。因此,为什么 Mongo 会抛出可序列化的错误。

您应该使用 DBObject 初始化您的数组,并尝试在您的代码中使用它们以避免此错误。

List<DBObject> students= new ArrayList<>();

并尝试在此对象中添加学生详细信息。

或者你也可以使用 BasicDBList 如下

for(Tag tag:tags){
    BasicDBList student= new BasicDBList();
     for(int i = 0; i < studentArray.size(); i++){
    stud = studentArray.get(i);
    student.add(stud);
}

上面可能包含一些语法错误,但这些类型的初始化应该有助于通过 JAVA 在 Mongo 中添加值数组

【讨论】:

  • stud = studentArray.get(i); student.add(stud); 这不起作用,因为Stundent 对象仍被添加到列表中
  • 是的..代码可能包含一些错误。我没有执行和检查。但我试图暗示你不能将 JAVA 对象插入 Mongo
猜你喜欢
  • 2013-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多