2016-04-18 11 views
0

をハードコーディング私はこのような書き込み動作の決まり文句を奪うカスタムアクションを作成したいと思います:プレイアクション構成 - パラメータ化されたパーサ

Action[MyClass](BodyParsers.parse.json[MyClass]) { req => ... 

はしかし、私は、クラス定義のエラーに実行し続けます。私はcomposeAction[A]composeAction[A: Reads]を変更した場合、それはタイプA.

ためのJSONシリアライザがない私に指示 method composeAction overrides nothing.

:ここに私の最も成功した試みてきました:

class JsonAction[A: Reads] extends ActionBuilder[Request] { 
    def hardcodedJson[A: Reads](action: Action[A]) = 
    Action.async(BodyParsers.parse.json[A]) { request => action(request) } 

    def invokeBlock[A: Reads](request: Request[A], block: (Request[A]) => Future[Result]) = { 
    block(request) 
    } 
    override def composeAction[A: Reads](action: Action[A]) = hardcodedJson(action) 
} 

が、私は次のエラーを取得します

このカスタムアクションを定義する他の方法はありますか?

答えて

1

ええ、私は公式ActionBuilderの方法でそれを働かせようとしましたが、ちょうどラインアップするタイプを得ることができませんでした。ここで

は、しかし、私のために働いた何か:あなたのコントローラで

object JsonActionHelper { 
    def withReads[A](act: Request[A] => Future[Result])(implicit reads:Reads[A]) = 
    Action.async(BodyParsers.parse.json(reads))(act) 
} 

は、使用方法(FooJsonが暗黙のReads[Foo]を含むobjectです):

import models.FooJson._ 
import JsonActionHelper._ 

def handleIncomingFoo(fooId:String) = withReads[Foo] { req => 
    val foo:Foo = req.body 
    ... 
    Ok(...) 
} 
1

ActionBuilderがあなたのuse-のための十分な汎用的ではありません場合; Reads[T]にあなたが渡すことはありません。

ActionBuilderについては何も特別なことはありません。それはapplyasyncファクトリメソッドのコレクションです。任意のファクトリメソッドを使用して独自のアクションタイプを定義できます。

object JsonAction { 
    def apply[A : Reads](request: Request[A] => Result) = Action(BodyParsers.parse.json[A])(request) 
} 

// these are equivalent: 
Action[MyClass](BodyParsers.parse.json[MyClass]) { req => ??? } 
JsonAction[MyClass] { req => ??? } 
関連する問題