无法在 mongo 数据库中插入集合:找不到编解码器
Unable to insert collection in mongo database: Can't find a codec
Mongo 尝试在集合中插入新文档时运行时抛出以下错误。请注意,数据库和集合尚不存在(我的假设是 mongo 运行时将创建数据库,然后是集合,然后通过使用默认编解码器将我的 POJO 转换为 BSON 来插入我的第一个文档)。有什么建议吗?
错误:2015-12-13 18:46:46,384 - application-akka.actor.default-dispatcher-3 - [error] - application - 找不到编解码器class models.User.
/*型号Class*/
package models;
import javax.persistence.Id;
import org.mongojack.ObjectId;
public class User {
@ObjectId @Id public String _id;
public String firstname;
public String lastname;
public String email;
public String phone;
public String address;
}
/* 控制器 Class */
public class Users extends Controller {
@BodyParser.Of(BodyParser.Json.class)
public Result create() {
Logger.info("Enter - Users::create()");
try {
Form<User> user = Form.form(User.class).bindFromRequest();
if (user.hasErrors()) {
Logger.info("User: " + user.toString());
Logger.info(user.errorsAsJson().toString());
return badRequest(user.errorsAsJson());
}
else {
User oneUser = user.get();
MongoClient mongoClient= new MongoClient();
MongoDatabase db = mongoClient.getDatabase("marketplace");
MongoCollection<User> col = db.getCollection("users", User.class);
col.insertOne(oneUser);
mongoClient.close();
return ok();
}
}
catch (Exception e) {
Logger.error(e.getLocalizedMessage());
return internalServerError(e.getMessage());
}
finally {
Logger.info("Exit - Users::create()");
}
}
}
您必须使用 JacksonDBCollection 包装 MongoCollection 才能启用所有 MongoJack 功能。
像这样:
JacksonDBCollection<User, String> userColl = JacksonDBCollection.wrap(col, User.class, String.class);
然后使用 userColl 插入您的新对象。
目前看来只有这个支持了。这需要使用 getDB() 方法,该方法自 mongo 驱动程序 3.0 以来已弃用。
请在此处查看 github 上的相关问题:
https://github.com/mongojack/mongojack/issues/105
是的 - 这行得通。但是我不得不使用已弃用的 getDB,因为它有一个 getter returns 类型的 DBCollection 集合,"wrap" 函数需要它。我希望改用 getDatabase 但得到了 Jackson 的 "Wrap" 不接受的 MongoCollection。有什么建议吗?
User oneUser = user.get();
MongoClient mongoClient= new MongoClient();
DB db = mongoClient.getDB("marketplace");
DBCollection col = db.getCollection("marketplace");
JacksonDBCollection<User, String> userCol = JacksonDBCollection.wrap(col,User.class, String.class);
userCol.insert(oneUser);
Mongo 尝试在集合中插入新文档时运行时抛出以下错误。请注意,数据库和集合尚不存在(我的假设是 mongo 运行时将创建数据库,然后是集合,然后通过使用默认编解码器将我的 POJO 转换为 BSON 来插入我的第一个文档)。有什么建议吗?
错误:2015-12-13 18:46:46,384 - application-akka.actor.default-dispatcher-3 - [error] - application - 找不到编解码器class models.User.
/*型号Class*/
package models;
import javax.persistence.Id;
import org.mongojack.ObjectId;
public class User {
@ObjectId @Id public String _id;
public String firstname;
public String lastname;
public String email;
public String phone;
public String address;
}
/* 控制器 Class */
public class Users extends Controller {
@BodyParser.Of(BodyParser.Json.class)
public Result create() {
Logger.info("Enter - Users::create()");
try {
Form<User> user = Form.form(User.class).bindFromRequest();
if (user.hasErrors()) {
Logger.info("User: " + user.toString());
Logger.info(user.errorsAsJson().toString());
return badRequest(user.errorsAsJson());
}
else {
User oneUser = user.get();
MongoClient mongoClient= new MongoClient();
MongoDatabase db = mongoClient.getDatabase("marketplace");
MongoCollection<User> col = db.getCollection("users", User.class);
col.insertOne(oneUser);
mongoClient.close();
return ok();
}
}
catch (Exception e) {
Logger.error(e.getLocalizedMessage());
return internalServerError(e.getMessage());
}
finally {
Logger.info("Exit - Users::create()");
}
}
}
您必须使用 JacksonDBCollection 包装 MongoCollection 才能启用所有 MongoJack 功能。
像这样:
JacksonDBCollection<User, String> userColl = JacksonDBCollection.wrap(col, User.class, String.class);
然后使用 userColl 插入您的新对象。
目前看来只有这个支持了。这需要使用 getDB() 方法,该方法自 mongo 驱动程序 3.0 以来已弃用。
请在此处查看 github 上的相关问题:
https://github.com/mongojack/mongojack/issues/105
是的 - 这行得通。但是我不得不使用已弃用的 getDB,因为它有一个 getter returns 类型的 DBCollection 集合,"wrap" 函数需要它。我希望改用 getDatabase 但得到了 Jackson 的 "Wrap" 不接受的 MongoCollection。有什么建议吗?
User oneUser = user.get();
MongoClient mongoClient= new MongoClient();
DB db = mongoClient.getDB("marketplace");
DBCollection col = db.getCollection("marketplace");
JacksonDBCollection<User, String> userCol = JacksonDBCollection.wrap(col,User.class, String.class);
userCol.insert(oneUser);