生成 Play 2 的 javascript 路由器的更简洁的方法

2024-03-22

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

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

我真正想做的是创建一个javascriptRouter与所有路线routes文件,所以我不必手动更新javascriptRoutes每次我添加新的控制器方法时都会定义。

有没有办法完成这项任务,或者是否有一种稍微不那么冗长的方法来定义javascriptRouter?


您可以通过反射来做到这一点,如下所示:

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

这是从 target/scala-2.x.x/src_management 中找到的生成源文件派生的。您实际上可以添加自己的源生成器并自己解析路由文件,但我发现通过反射来完成它更容易。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

生成 Play 2 的 javascript 路由器的更简洁的方法 的相关文章

随机推荐