35

Java を使用して Java オブジェクト全体を MongoDB コレクションに挿入しようとしています。次のエラーが表示されます:

エラー :

Exception in thread "main" java.lang.IllegalArgumentException: can't serialize class net.yogesh.test.Employee
    at org.bson.BSONEncoder._putObjectField(BSONEncoder.java:185)
    at org.bson.BSONEncoder.putObject(BSONEncoder.java:119)
    at org.bson.BSONEncoder.putObject(BSONEncoder.java:65)
    at com.mongodb.DBApiLayer$MyCollection.insert(DBApiLayer.java:176)
    at com.mongodb.DBApiLayer$MyCollection.insert(DBApiLayer.java:134)
    at com.mongodb.DBApiLayer$MyCollection.insert(DBApiLayer.java:129)
    at com.mongodb.DBCollection.save(DBCollection.java:418)
    at net.yogesh.test.test.main(test.java:31)

Emplyoee.java (POJO)

package net.yogesh.test;

import java.io.Serializable;

public class Employee implements Serializable {

    private static final long serialVersionUID = 1L;
    private long no;
    private String name;

    public Employee() {
    }

    public long getNo() {
        return no;
    }

    public void setNo(long no) {
        this.no = no;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

メイン メソッド クラス (test.java)

package net.yogesh.test;

import java.net.UnknownHostException;

import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.Mongo;
import com.mongodb.MongoException;

public class test {

    public static void main(String[] args) throws UnknownHostException,
            MongoException {

        Mongo mongo = new Mongo("localhost", 27017);
        DB db = mongo.getDB("test");

        Employee employee = new Employee();
        employee.setNo(1L);
        employee.setName("yogesh");


        BasicDBObject basicDBObject = new BasicDBObject("Name", employee);

        DBCollection dbCollection = db.getCollection("NameColl");

        dbCollection.save(basicDBObject);   

    }

}

このエラーが発生する理由を誰か説明できますか?

4

12 に答える 12

32

そもそもなぜこれが機能すると思うのか、少し混乱しています。最初に知っておく必要があるのは、POJO を MongoDB ドキュメントにマップする方法です。現在、システム(コード)にその方法を伝えていません。

これにはマッピング ライブラリ (Morphia が思い浮かびます) を使用するか、ReflectionDBObject を使用できます。どちらのソリューションでも、POJO を MongoDB ドキュメントに、または MongoDB ドキュメントを POJO にマップできます (前者の方法は後者よりもはるかにうまくいきます)。

于 2012-04-16T08:05:15.887 に答える
26
DB db = mongoClient.getDB( "mydb" );

coll = db.getCollection("testCollection");

Employee emp = new Employee();
emp.setId("1001");
emp.setName("John Doe");

//Converting a custom Class(Employee) to BasicDBObject
Gson gson = new Gson();
BasicDBObject obj = (BasicDBObject)JSON.parse(gson.toJson(emp));
coll.insert(obj);
findEmployee(new BasicDBObject("id","1001"));


public static void findEmployee(BasicDBObject query){

    DBCursor cursor = coll.find(query);

    try {
       while(cursor.hasNext()) {
          DBObject dbobj = cursor.next();
        //Converting BasicDBObject to a custom Class(Employee)
          Employee emp = (new Gson()).fromJson(dbobj.toString(), Employee.class);
          System.out.println(emp.getName());
       }
    } finally {
       cursor.close();
    }

}

両方の方法で変換を行うコードを投稿すると便利だと思いました。
従業員オブジェクトの保存 従業員オブジェクトの
検索と再作成
これが役に立てば幸いです..

于 2013-12-18T16:42:44.640 に答える
13

gson ライブラリを使用して Java オブジェクトを json 文字列に変換し、それを mongodb に挿入できます。

例えば:

Gson gson = new Gson();
String json = gson.toJson(Employee);    
BasicDBObject basicDBObject = new BasicDBObject("Name", json );          
DBCollection dbCollection = db.getCollection("NameColl");          
dbCollection.save(basicDBObject);    
于 2012-04-16T13:17:11.523 に答える
7

この質問が出されてから、いくつかの変更がありました。質問で使用test.javaすると、Googleのを使用して私にとってうまくいったのは次のGsonとおりです。

import com.google.gson.Gson;
import com.mongodb.Block;
import com.mongodb.MongoClient;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;

public class test {
  public static void main(String[] args) {
    MongoClient mongoClient = new MongoClient(); // Connect with default settings i.e. localhost:27017
    MongoDatabase db = mongoClient.getDatabase("test"); // Get database "test". Creates one if it doesn't exist
    Employee employee = new Employee(); // Create java object
    employee.setNo(1L);
    employee.setName("yogesh");
    // Deserialize object to json string
    Gson gson = new Gson();
    String json = gson.toJson(employee);
    // Parse to bson document and insert
    Document doc = Document.parse(json);
    db.getCollection("NameColl").insertOne(doc);

    // Retrieve to ensure object was inserted
    FindIterable<Document> iterable = db.getCollection("NameColl").find();
    iterable.forEach(new Block<Document>() {
      @Override
      public void apply(final Document document) {
        System.out.println(document); // See below to convert document back to Employee
      }
    });

  }
}

Gson取得した bson ドキュメントを Java オブジェクトに戻すために使用することもできます。

Gson gson = new Gson();
Employee emp = gson.fromJson(document.toJson(), Employee.class);
于 2015-10-22T17:57:52.780 に答える
6

MongoDB では、Java Bean を DB に挿入することはできませんが、それらを MongoDB オブジェクトに再マップする必要があります。

あなたの場合、あなたはしなければなりません:

BasicDBObject basicDBObject = new BasicDBObject();
basicDBObject.put("no", employee.getNo());
basicDBObject.put("name", employee.getName());
于 2012-04-16T08:02:53.593 に答える
0

Java BasicDBObject を MongoDb コレクションに挿入しようとすると、同じエラーが発生します。

私のオブジェクトは、Json に変換された Xml から作成されます。

java.lang.IllegalArgumentException: can't serialize class net.sf.json.JSONNull
    at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:299)
    at org.bson.BasicBSONEncoder.putMap(BasicBSONEncoder.java:339)
    at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:261)

このエラーは、Xml の空のタグが原因で発生します。空のタグをすべて削除すると、解決しました。

于 2015-07-24T13:12:23.697 に答える