このコードは、優れたリアクティブ mongo ドキュメントに従って作成したテンプレートで見つけたと思います。
説明する義務が少しあります。コードを実行してみましょう。
def createFromJson = Action.async(parse.json) { request =>
関数 createFromJson は、JSON 形式のボディを処理する非同期の (結果の未来を返す) アクション (再生のもの) を返します。そのために、リクエストを使用します。
ドキュメント: https://www.playframework.com/documentation/2.5.x/ScalaAsync
json は、配列、文字列、オブジェクトなど、json 形式に従うものであれば何でも構いません。
トランスフォーマーは、必要なデータのみを json から取得し、クリーンな json オブジェクトを返します。
val transformer: Reads[JsObject] =
Reads.jsPickBranch[JsString](__ \ "name") and
Reads.jsPickBranch[JsNumber](__ \ "age") and
Reads.jsPut(__ \ "created", JsNumber(new java.util.Date().getTime())) reduce
ご覧のとおり、ブランチ名を文字列として、ブランチの年齢を数値として選択します。また、作成時に作成されたフィールドを最終的な json オブジェクトに追加します。
ご覧のとおり、これを Person インスタンスに変換していません。
val transformer: Reads[JsObject] ....
Play は、より簡単な方法で json を処理するいくつかの方法を提供します。この例では、モデルに変換せずに json 値を直接操作することの威力を示しています。たとえば、ケースクラスがある場合
case class Person(name: String, age: Int)
そこから読み取りを自動的に作成できます。
val personReads: Person[Person] = Json.reads[Person]
しかし、Mongo DB に保存するだけでは、このインスタンスを構築してから再度 json に変換する必要はありません。もちろん、モデルを挿入する前に何らかのロジックを実行する必要がある場合は、モデルを作成する必要があります。
ドキュメンテーション:
これを念頭に置いて、コードの残りの部分は明確にする必要があります
request.body.transform(transformer).map { result =>
collection.insert(result).map { lastError =>
Logger.debug(s"Successfully inserted with LastError: $lastError")
Created
}
}
リクエストからボディ (JsValue) を取得し、それを JsObject (結果) に変換して、コレクションに挿入します。Insert は最後のエラーで Future を返します。Person が格納されると、最後のエラーがログに記録され、Created (201 コード) が API のクライアントに返されます。
最後のビットも今ではクリアされているはずです
}.getOrElse(Future.successful(BadRequest("invalid json")))
リクエストの json ボディを解析して JsObject に変換する際に問題が発生した場合は、結果として BadRequest (400 コード) を含む既に完了した Future がクライアントに返されます。Action.Async は戻り値の型として結果の未来を必要とするため、これは未来です。
スカラを楽しむ。