1

私は必死です。公式ドキュメントの最後の段落のように ActionComposition を実行しようとしました: https://playframework.com/documentation/2.3.x/ScalaActionsComposition

私のコード:

object ActionBuilder1 extends ActionRefiner[Request, Request] {
  override protected def refine[A](request: Request[A]): Future[Either[Result, Request[A]]] = Future {Right(request)}
}


object ActionBuilder2 extends ActionBuilder[Request] {
  def invokeBlock[A](request: Request[A], block: (Request[A]) => Future[Result]) : Future[Result] = {
    block(request)
  }
}

私のコントローラーで:

def yolo = ActionBuilder2 andThen ActionBuilder1 {
  Ok("ASd")
}

しかし、コンパイラは次のように述べています。

actions.ActionBuilder1.type does not take parameters
def yolo = ActionBuilder2 andThen ActionBuilder1 {
                                               ^

なぜだか本当にわからない…

4

1 に答える 1

2

Scalaはあなたが何を意味するのか理解できないと思います:

ActionBuilder2 andThen ActionBuilder1 { // Some block }

したがって、最も簡単な方法は、そのチェーンをそれ自体のものとして宣言してから、それにブロックを適用することです。

val actionChain = ActionBuilder2 andThen ActionBuilder1

def yolo = actionChain { 
  Ok("yolo")
}

ログを介して、目的の順序 ( 2then ) で動作していることを確認します。1

object ActionBuilder1 extends ActionRefiner[Request, Request] {
  override protected def refine[A](request: Request[A]): Future[Either[Result, Request[A]]] = Future {
    Logger.info("ActionBuilder1")
    Right(request)
  } 
} 


object ActionBuilder2 extends ActionBuilder[Request] {
  def invokeBlock[A](request: Request[A], block: (Request[A]) => Future[Result]) : Future[Result] = {
    Logger.info("ActionBuilder2")
    block(request)
  }
}

エンドポイントをリクエストしたときのコンソールで:

[info] application - ActionBuilder2
[info] application - ActionBuilder1
于 2015-05-01T00:37:52.160 に答える