生成Play 2的javascript路由器的详细方法

sol*_*oth 10 scala playframework-2.0

目前我以相当冗长的方式定义我的应用程序的javascript路由器

def javascriptRoutes = Action { implicit request =>
  import routes.javascript._
  Ok(Routes.javascriptRouter("jsRoutes")(
    Login.method1,Login.Method2,
    OtherController.method1,OtherController.method2,
    //[...]
  )).as("text/javascript")
}
Run Code Online (Sandbox Code Playgroud)

我真正想做的是创建一个javascriptRouter包含文件中所有路由的routes文件,因此javascriptRoutes每次添加新的控制器方法时都不必手动更新定义.

有没有办法完成这项任务,或者是否有一种稍微简单的定义方式javascriptRouter

tha*_*ing 16

您可以通过反射这样做:

val routeCache = {
    import routes._
    val jsRoutesClass = classOf[routes.javascript]
    val controllers = jsRoutesClass.getFields().map(_.get(null))
    controllers.flatMap { controller =>
        controller.getClass().getDeclaredMethods().map { action =>
            action.invoke(controller).asInstanceOf[play.core.Router.JavascriptReverseRoute]
        }
    }
}

def javascriptRoutes = Action { implicit request =>
    Ok(Routes.javascriptRouter("jsRoutes")(routeCache:_*)).as("text/javascript")
}
Run Code Online (Sandbox Code Playgroud)

这是从target/scala-2.xx/src_managed中生成的源文件派生的.您实际上可以添加自己的源生成器并自己解析路径文件,但我发现通过反射更容易.

您可能想要做的另一件事是过滤掉您不想要的方法,因为这将为您提供所有路由(包括javascriptRouter本身).