在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")
}
但是当您想要将日志记录操作应用于项目范围内的所有操作方法时,这看起来非常难看。
答案 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)
}
}
}