2

解析して検証 する BodyParser を実装したいのですが、これは以下にrequest.body基づいてparse.jsonおり、現在は次のようになっています。

def parseModel[A](implicit reads: Reads[A]): BodyParser[JsResult[A]] =
  parse.json.map(_.validate[A])

BodyParser[JsResult[A]]問題は、私がそれを type にしたいのに、現在は type であることですBodyParser[A]JsError基本的に検証エラーで返して400 Bad Requestほしい。

Play API ドキュメントでは、以前のボディ パーサーの結果を調べて結果を返したり、コントローラーに続行したりできるメソッドが見つかりません。

4

2 に答える 2

10

BodyParserは、本文を解析した後、 を生成します。 は、アクションを処理する代わりにすぐに返す必要があるエラー結果ですEither[SimpleResult, A]SimpleResultの便利なメソッドでBodyParserはこれを行うことができないため、代わりに、JSON ボディ パーサーに委譲する新しいボディ パーサーを作成します。

def validateJson[A](implicit reads: Reads[A]) = new BodyParser[A] {
  def apply(request: RequestHeader) = parse.json(request).map(_.right.flatMap { json =>
    json.validate[A].asEither.left.map(e => BadRequest(JsError.toFlatJson(e)))
  })
}

ここで、解析の結果をマッピングし、right値を取得して (解析が成功すると、 になりますJsValue)、それを呼び出しflatMapていることがわかります。私たちのメソッドはからを にflatMap変換するので、の途中まで来ました。JsResultvalidateEither[JsError, A]AmapJsErrorSimpleResult

于 2013-09-23T07:10:17.033 に答える