0

次のようなアクションを書く定型文を取り除くカスタム アクションを作成したいと思います。

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

ただし、クラス定義エラーが発生し続けます。これが私の最も成功した試みです:

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)
}

しかし、次のエラーが表示されます。method composeAction overrides nothing.

変更composeAction[A: Reads]するcomposeAction[A]と、タイプ A の Json シリアライザーがないことがわかります。

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

4

2 に答える 2

1

ActionBuilderユースケースに対して十分に一般的ではありません。あなたがあなたに渡す場所はありませんReads[T]

といっても、特別なことは何もありませんActionBuilderapplyおよびasyncファクトリ メソッドのコレクションです。必要なファクトリ メソッドを使用して、独自の Action タイプを定義できます。

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 => ??? }
于 2016-04-23T23:17:00.390 に答える