3

以下は、以前の投稿で提示したケース クラスです ... ただし、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")
    )
  }
}

今、受信した Json を検証してデータベース (MongoDB) に保存する Play コントローラーを実装しようとしています。以下は私のコードです:

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]                          ^

andを実装する代わりに、コンパニオン オブジェクトで定義したBSONDocumentWriterandを再利用することは可能でしょうか?BSONDocumentReaderUserReadsWrites

4

2 に答える 2

1

あなたがまだもっと複雑な例を探しているなら、私はこれで3時間後に終わります. これはモデルの自動書き込みの基本的な実装であり、json リクエストを検証し、10 行のコードでコレクションに保存しています :) コントローラーで挿入を繰り返す必要はありません

https://github.com/MilosMosovsky/play-reactivemongo-models

于 2015-06-25T23:10:28.573 に答える
1

いいえ、BSON ドキュメント リーダー/ライターを JSON の読み取り/書き込みとして再利用することはできません。ただし、JSON の読み取り/書き込みを BSON ドキュメントの読み取り/書き込みとして再利用できます。を使用しJSONCollectionて play-reactive-mongo-plugin からデータベースにアクセスし、BSON ドキュメントのリーダー/ライターを JSON の読み取り/書き込みに書き換えます。play-mongo-knockout アクティベーター テンプレートでこれを行う例を確認できます。

https://github.com/typesafehub/play-mongo-knockout

于 2014-01-01T20:05:28.813 に答える