【问题标题】:Playframework2 - Scala, Controller-Wide Action CompositionPlayframework2 - Scala,控制器范围的动作组合
【发布时间】:2013-03-22 07:02:56
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

  • 据我所知,没有办法。你当然可以用 trait 覆盖 Action,但它是一样的......

标签: java scala playframework-2.0


【解决方案1】:

我认为动作组合不可能。 一个解决方案可能是通过覆盖 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)
     }
  }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-01
    • 2015-10-12
    • 1970-01-01
    • 1970-01-01
    • 2014-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多