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 回答