2017-04-15 1 views

答えて

1

あなたは、行動を扱うあなたのエラーをラップする方法を作ることができ、このような何か:

def withParsedJsonRequest[T](actionBody: T => Future[Result])(
implicit reads: Reads[T], req: Request[JsValue]): Future[Result] = { 
    req.body.validate[T].fold(
    invalid => { Future.successful(BadRequest("An error occured...")) }, // do error handling here! 
    valid => { actionBody(valid) }) 
} 

Action秒でそれを使用します。

def bla = Action.async(parse.json) { implicit req => 
    withParsedJsonRequest[Bla] { b => 
    Future.successful(Ok) 
    } 
} 

あなたは(Tの暗黙のReadsを渡す必要がありますJSONの解析用)をwithParsedJsonRequest関数に、またRequest[JsValue](これを繰り返す必要はありません)に設定します。

「actionBody」と呼ばれるコールバック関数は、アクションの肉です。これは、解析されたTをとり、それと何かをします。

私はあなたがスコープに暗黙のReads[T]を持っており、(あなたが何らかの形でカスタマイズすることができます)プレイのエラーハンドラを使用することに同意した場合、体がある

+0

'withParsedJsonRequest'はデフォルト値で '無効な'関数を受け取ることもできます – pedrorijo91

0

...カスタムActionを作るが、なぜわざわざことができると思いますあなたが欲しいものだけでないパーサは:

def foo = Action(parse.json[T]) { request => 
    val body: T = request.body 
    ... 
} 

注しかし、これはContent-Typeapplication/jsonに設定されていない場合は400を返すこと(tolerantJsonとは等価ではありません)。

関連する問題