无法在mongo数据库中插入集合:无法找到编解码器

时间:2015-12-13 13:22:26

标签: mongodb playframework-2.0 codec

在尝试在集合中插入新文档时,Mongo运行时会抛出以下错误。请注意,数据库和集合尚不存在(我的假设是mongo运行时将创建数据库,然后是集合,然后通过使用默认编解码器将我的POJO转换为BSON来插入我的第一个文档)。有什么建议吗?

错误:2015-12-13 18:46:46,384 - application-akka.actor.default-dispatcher-3 - [错误] - 应用程序 - 无法找到类模型的编解码器。用户

/ * Model 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;
}

/ *控制器类* /

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()");
    }
  }
}

2 个答案:

答案 0 :(得分:0)

您必须使用JacksonDBCollection包装MongoCollection以启用所有MongoJack功能。

这样的事情:

JacksonDBCollection<User, String> userColl = JacksonDBCollection.wrap(col, User.class, String.class);

然后使用userColl插入新对象。

这似乎是目前支持的唯一方式。这需要使用自mongo驱动程序3.0以来不推荐使用的getDB()方法。 请参阅github上的相关问题:
https://github.com/mongojack/mongojack/issues/105

答案 1 :(得分:0)

是的 - 这很有效。但是我不得不使用不推荐使用的getDB,因为它有一个getter,返回类型为DBCollection的集合,其中包含&#34; wrap&#34;功能期望。我本来希望使用getDatabase而是让我获得MongoCollection,其中包括Jackson&#34; Wrap&#34;不接受。有什么建议吗?

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);