Javaを使用して、MongoDBコレクションにJavaオブジェクト全体を挿入しようとしています。次のエラーが表示されます。
エラー:
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);
}
}
このエラーが発生する理由を誰かが説明できますか?
そもそもこれがうまくいくと思う理由については少し混乱しています。 POJOをMongoDBドキュメントにマップする方法を知る必要があります。現在、あなたはシステムのどの部分にもその方法を教えていません。
このためにマッピングライブラリを使用するか(Morphiaが思い浮かぶ)、ReflectionDBObjectを使用できます。どちらのソリューション(前者の方が後者よりもはるかに優れています)を使用すると、POJOをMongoDBドキュメントにマップしたり、逆にマップしたりできます。
プロ
必要に応じて、強力な型指定されたオブジェクトを引き続き使用します
コントラ
一部の人々は本当に嫌いです:拡張
package foo;
import com.mongodb.BasicDBObject;
public class Employee extends BasicDBObject {
private static final long serialVersionUID = 2105061907470199595L;
//should be something shorter as "name" like "n"
//here just use name to conform your sample
public static final String NAME = "name";
public static final String NO = "no";
public static final String COLLECTION_NAME = "employee";
public Long getNo() {
return getLong(NO);
}
public void setNo(long no) {
put(NO, no);
}
public String getName() {
return getString(NAME);
}
public void setName(String name) {
put(NAME, name);
}
</ code>
}
package foo;
import Java.net.UnknownHostException;
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("yeahMongo");
Employee employee = new Employee();
employee.setNo(1L);
employee.setName("yogesh");
DBCollection employeeCollection = null ;
employeeCollection = db.getCollection(Employee.COLLECTION_NAME);
employeeCollection.save(employee);
System.err.println(employeeCollection.findOne());
}
</ code>
}
Morphiaに加えて、jongoを確認する必要があります。 http://jongo.org/ jongoはjs mongoエンジンと同じ形式の構文を使用します。メンタルマップをmongojsとJavaの間で切り替える必要はありません。 jsサンプルをほとんど変更せずに使用できます。
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();
}
}
両方の方法で変換を行うコードを投稿することは有用だと思いました。
従業員オブジェクトの保存
従業員オブジェクトの検索と再作成
これが役立つことを願っています。
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);
この質問が尋ねられてから、いくつかの変更がありました。質問で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);
MongoDBでは、Java BeanをDBに挿入できませんが、MongoDBオブジェクトに再マッピングする必要があります。
あなたの場合、あなたはする必要があります:
BasicDBObject basicDBObject = new BasicDBObject();
basicDBObject.put("no", employee.getNo());
basicDBObject.put("name", employee.getName());
うまくいけば、これはあなたのために働くとあなたはそれから助けを得ることができます。データベース操作(挿入、削除、更新、取得、getall)を実行し、MongoDBでの操作にPersonオブジェクトを使用して、Javaをデモ目的で使用しました。
Connection.Java
package test;
import org.bson.codecs.configuration.CodecRegistry;
import org.bson.codecs.pojo.PojoCodecProvider;
import static org.bson.codecs.configuration.CodecRegistries.fromProviders;
import static org.bson.codecs.configuration.CodecRegistries.fromRegistries;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions;
import com.mongodb.client.MongoDatabase;
public class Connection {
public MongoClient mongo;
private String db;
public MongoDatabase database;
private static Connection instance;
private Connection() {
db = "chatsystem";
CodecRegistry pojoCodecRegistry = fromRegistries(MongoClient.getDefaultCodecRegistry(),
fromProviders(PojoCodecProvider.builder().automatic(true).build()));
mongo = new MongoClient("localhost", MongoClientOptions.builder().codecRegistry(pojoCodecRegistry).build());
database = mongo.getDatabase(db);
}
public static Connection getInstance() {
if (instance == null) {
instance = new Connection();
return instance;
} else {
return instance;
}
}
}
Person.Java
package test;
import org.bson.types.ObjectId;
public class Person {
public Person() {
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getFname() {
return fname;
}
public void setFname(String fname) {
this.fname = fname;
}
public String getLname() {
return lname;
}
public void setLname(String lname) {
this.lname = lname;
}
private ObjectId id;
public Person(String username, String email, String password, String fname, String lname) {
super();
this.username = username;
this.email = email;
this.password = password;
this.fname = fname;
this.lname = lname;
}
public ObjectId getId() {
return id;
}
public void setId(ObjectId id) {
this.id = id;
}
private String username;
private String email;
private String password;
private String fname;
private String lname;
}
test.Java
package test;
import Java.util.ArrayList;
import Java.util.Iterator;
import Java.util.List;
import static com.mongodb.client.model.Filters.*;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
public class test {
private MongoCollection<Person> person;
Connection conn;
public void getCollection() {
conn = Connection.getInstance();
person = conn.database.getCollection("person", Person.class);
}
public static void main(String[] args) throws Exception {
test t = new test();
t.getCollection();
Person p = new Person();
p.setEmail("[email protected]");
p.setFname("ftest");
p.setLname("ltest");
p.setPassword("testtest");
p.setUsername("test123");
// insert person type objects in database
t.insertPerson(p);
// get all persons from database
List<Person> pp = t.getAllPersons();
Person pt = pp.get(0);
System.out.println(pt.getEmail());
System.out.println(pt.getId());
// get one person from database by username filter
// pass username of person in method argument
Person ph = t.getOnePerson("test123");
System.out.println(ph.getEmail());
System.out.println(ph.getId());
// update/edit person by username filter
// pass username of person in method argument
t.updatePerson("test123");
// delete person by username filter
// pass username of person in method argument
t.removePerson("updatetest123");
}
public void insertPerson(Person p) {
person.insertOne(p);
}
public List<Person> getAllPersons() {
FindIterable<Person> iterable = person.find();
Iterator it = iterable.iterator();
List<Person> allPersons = new ArrayList<>();
while (it.hasNext()) {
Person per = (Person) it.next();
allPersons.add(per);
}
return allPersons;
}
public Person getOnePerson(String username) {
return person.find(eq("username", username)).first();
}
public void updatePerson(String username) {
Person p = new Person();
p.setEmail("[email protected]");
p.setFname("updateftest");
p.setLname("updateltest");
p.setPassword("updatetesttest");
p.setUsername("updatetest123");
person.replaceOne(eq("username", username), p);
}
public void removePerson(String username) {
person.deleteOne(eq("username", username));
}
}
Moprphia のような特別なオブジェクトドキュメントマッピングフレームワークAPIを使用できます。
BasicDBObjectBuilder を使用して、POJOを DBObject のインスタンスに変換します。このインスタンスは DBCollection で保存できます。
_import com.mongodb.BasicDBObjectBuilder;
import com.mongodb.DBObject;
public class Employee {
private long no;
private String name;
// Getters and Setters
public DBObject toDBObject() {
BasicDBObjectBuilder builder = BasicDBObjectBuilder
.start("no", no)
.append("name", name);
return builder.get();
}
}
_
保存するには、POJOインスタンスでtoDBObject()
を呼び出して、コレクションに提供します。
_public class test {
public static void main(String[] args) throws UnknownHostException,
MongoException {
...
DBCollection dbCollection = db.getCollection("NameColl");
Employee employee = new Employee();
employee.setNo(1L);
employee.setName("yogesh");
dbCollection.save(employee.toDBObject());
}
}
_
このアプローチの使用:
DBObject
を作成する必要はありませんMongoJack をお勧めします。これは、Java MongoDBドキュメントとの間でオブジェクトをマッピングする適切なライブラリです。
コードは次のようになります。
import Java.util.Arrays;
import org.mongojack.JacksonDBCollection;
import com.mongodb.DB;
import com.mongodb.MongoClient;
import com.mongodb.ServerAddress;
public class Test {
public static void main(String[] args) {
MongoClient mongoClient = new MongoClient(Arrays.asList(new ServerAddress("localhost", 27017)));
DB db = mongoClient.getDB("test");
Employee employee = new Employee();
employee.setNo(1L);
employee.setName("yogesh");
JacksonDBCollection<Employee, String> collectionData = JacksonDBCollection.wrap(db.getCollection("NameColl"), Employee.class, String.class);
collectionData.save(employee);
mongoClient.close();
}
}
(PS:現在、mongo-Java-driver v3.2.2とmongojack v2.6.1を使用しています)
保存するのではなく、「insertOne」メソッドを使用してください。
MongoCollection collection;
String collectionName = "somename";
String jsonObject = "{}";
if (!mongoTemplate.collectionExists(collectionName)) {
collection = mongoTemplate.createCollection(collectionName);
logger.info("Collection %s was successfully created", collectionName);
} else {
collection = mongoTemplate.getCollection(collectionName);
}
collection.insertOne(Document.parse(jsonObject));
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の空のタグが原因で発生します。すべての空のタグを削除したとき、それを解決しました。
最新だが、Mongod 3.5以降では直接Beanを挿入できます。