2

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

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

Java 中的注解是由 Scala 中的辅助方法(装饰器)完成的。但是在 Scala 中,playframework2 文档中的唯一示例是每个方法。

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

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

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

但是,当您想将日志记录操作应用于项目范围内的所有操作方法时,这似乎很难看。

4

1 回答 1

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

}
于 2013-03-21T23:02:56.133 回答