[英]Play & ReactiveMongo: How to deserialize Json from request in controller
下面再次是我在上 一篇 文章中介绍的案例类...但是cmbaxter建议修复:
case class User(
id: Option[BSONObjectID],
name: String,
addresses: Option[List[BSONObjectID]]
)
object User {
implicit object UserWriter extends BSONDocumentWriter[User] {
def write(user: User) = BSONDocument(
"_id" -> user.id.getOrElse(BSONObjectID.generate),
"name" -> user.name,
"addresses" -> user.addresses
)
}
implicit object UserReader extends BSONDocumentReader[User] {
def read(doc: BSONDocument) = User(
doc.getAs[BSONObjectID]("_id"),
doc.getAs[String]("name").get,
doc.getAs[List[BSONObjectID]]("addresses")
)
}
}
现在我正在尝试实现一个Play控制器来验证传入的Json并将其保存到数据库(MongoDB)中。 以下是我的代码:
object Users extends Controller with MongoController {
private def collection = db.collection[JSONCollection]("users")
def create = Action.async(parse.json) { request =>
request.body.validate[User].map { user =>
collection.insert(user).map { lastError =>
Logger.debug(s"Successfully inserted with LastError: $lastError")
Created
}
}.getOrElse(Future.successful(BadRequest("invalid json")))
}
}
上面的代码无法编译,因为编译器找不到任何Json反序列化器:
[error] /home/j3d/Projects/test/app/controllers/Users.scala:44: No Json deserializer found for type models.User. Try to implement an implicit Reads or Format for this type.
[error] request.body.validate[User].map { user =>
[error] ^
是否可以重用我在User
伴侣对象中定义的BSONDocumentWriter
和BSONDocumentReader
,而不是实现Reads
和Writes
?
不,您不能将BSON文档读取器/写入器重用为JSON读/写。 但是,您可以将JSON读/写重用为BSON文档读取器/写入器。 您希望使用JSONCollection
从play-reactive-mongo-plugin访问数据库,然后将您的BSON文档读取器/写入器重写为JSON读/写。 您可以在play-mongo-knockout激活器模板中看到这样做的示例:
如果你还在寻找更复杂的例子我会在3小时后结束。 它是模型自动写入的基本实现,它验证json请求并存储到10行代码集合:)你不需要在控制器中重复插入
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.