Playframework2 - Scala,Controller-Wide Action Composition

时间:2013-01-30 14:37:32

标签: java scala playframework-2.0

在playframework 2中,如果您正在使用Java,则可以将任何动作合成注释直接放在Controller类上,然后将其应用于此控制器定义的所有操作方法,如action composition部分所述。在playframework2文档中。

@With(MyLogger.class)
public Admin extends Controller {
    ..
}

使用Scala中的辅助方法(装饰器)完成java中的注释。但是在Scala中,playframework2文档中的the only examples是每种方法。

我有一个日志记录装饰器,它在每个动作之前和之后记录,并测量执行该动作所需的时间。有没有办法将这个装饰器添加到控制器,以便它可以像Java一样应用于控制器中的每个操作方法?

我知道我可以使用LoggingAction包装每个方法:

def index = LoggingAction { request =>
  Ok("I have been logged")    
}

但是当您想要将日志记录操作应用于项目范围内的所有操作方法时,这看起来非常难看。

1 个答案:

答案 0 :(得分:0)

我不认为行动构成是可能的。 解决方案可能是通过覆盖onRouteRequest方法来使用ScalaInterceptors。

以下是一个例子:

import play.api._
import play.api.mvc._
import scala.util.matching.Regex

// Note: this is in the default package.
object Global extends GlobalSettings {

  private val controllerRoutePaths : List[Regex] =
List("""^/mycontroller/.*""".r,"""^/anOtherRegexFormycontroller/.*""".r)
  override def onRouteRequest(request: RequestHeader): Option[Handler] = {
     if(controllerRoutePaths.map(_.findFirstIn(request.path).isDefined).foldLeft(false)(_ || _)) {
       println("executed before every action in mycontroller:" )
       super.onRouteRequest(request)
     }
     else{
       super.onRouteRequest(request)
     }
  }

}