使用ReactiveMongo读取[T]验证器错误

时间:2013-10-13 00:51:11

标签: mongodb scala playframework reactivemongo

我有一个像这样的案例类

case class Wish(_id: Option[String], title : String, text :String, cash: Int, created_at:    Option[DateTime], updated_at : Option[DateTime])

我还定义了一个隐式读取验证器,如下所示

implicit val wishFormat = Json.format[Wish]

我正在尝试将Mongodb文档读入我的愿望课程,我收到如下错误

scala> val js = "{\"_id\":{\"$oid\":\"5259c384dd8251bb085adfb4\"},\"title\":\"Shrikar\",\"text\":\"test\",\"cash\":12.0,\"created_at\":1381614468235,\"updated_at\":1381614468235}"
js: String = {"_id":{"$oid":"5259c384dd8251bb085adfb4"},"title":"Shrikar","text":"test","cash":12.0,"created_at":1381614468235,"updated_at":1381614468235}

scala> val test = Json.parse(js)
test: play.api.libs.json.JsValue = {"_id":{"$oid":"5259c384dd8251bb085adfb4"},"title":"Shrikar","text":"test","cash":12.0,"created_at":1381614468235,"updated_at":1381614468235}

scala> test.validate[Wish]
res11: play.api.libs.json.JsResult[Wish] =   JsError(List((/_id,List(ValidationError(validate.error.expected.jsstring,WrappedArray())))))

你能帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

您的ID必须是BSONObjectID。

case class Wish(
  _id: Option[BSONObjectID],
  title: String,
  text: String,
  cash: Int,
  created_at: Option[DateTime],
  updated_at: Option[DateTime]
)

然后您必须从Play-ReactiveMongo插件导入格式:

import play.modules.reactivemongo.json.BSONFormats._

答案 1 :(得分:-1)

读取格式将play.api.libs.json.JsValue转换为对象。 Reads期望json值如下所示:

import play.api.libs.json.{Json, JsValue}
val js: JsValue = Json.obj(
  "_id" -> "5259c384dd8251bb085adfb4",
  "title" -> "Shrikar",
  "text" -> "test",
  "cash" -> 12.0,
  "created_at" -> 1381614468235,
  "updated_at" -> 1381614468235
)

首先,您应该查看Playframework working with JSON文档。如果您使用的是ReactiveMongo等库,则mongodb查询应返回BSONDocument或JsValue。根据{{​​3}}:

  

使用Play2-ReactiveMongo,您可以直接使用嵌入式JSON   Play中的库> = 2.1。有一个专门的集合叫   JSONCollection自然地处理JSValue和JSObject   ReactiveMongo的BSONDocument。

如果只能以字符串形式接收mongodb查询结果,则需要创建一个函数将其解析为JsValue。

我希望这有帮助!