繁体   English   中英

如何在play框架中获取所有Route URL字符串的列表?

[英]How to get list of all Route URL strings in play framework?

我的play 2.4.x应用程序中有很多控制器。

我想获得指向各自控制器的all route URLs的列表。 我知道如何从当前请求中获取URL。 但我需要一个播放应用程序中可用的所有URL列表。我想generate this list dynamically because URLs can be changed/added/deleted in future

那么,有什么方法可以动态生成这个URL列表吗? 或者我是否有义务将所有URL静态存储在缓存或字典中的某个位置?

我使用Router trait提供的documentation方法获得了所需的列表。 文档方法返回Seq[(String, String, String)]每个元组都有以下格式:

({http-method},{url},{controller method})

Router trait由所有自动生成的Routes.scala类扩展。 Scala编译器为应用程序中的每个routes文件生成单独的Routes.scala 这些自动生成的Routes.scala文件实现了Router trait的所有方法,包括我们上面讨论过的文档方法。

因此,要获取所有URL的列表,我只需要inject the Router trait ,然后访问documentation method

import play.api.routing.Router

class MyClass @Inject()(router: Router) {
 def getAllURLs:Seq[String] = router.documentation.map(k => k._2)
}

响应接受的答案:请注意,如果您在Controller中工作并尝试注入路由器,则会出现循环依赖性错误(因为路由器依赖于您的控制器)。 您可以通过执行以下操作来解决此问题:

private final Provider<Router> routerProvider;
@Inject
public MainController(Provider<Router> routerProvider) {
    this.routerProvider = routerProvider;
} 

然后

// later in execution
Router router = routerProvider.get();

if (!router.documentation().isEmpty()) {
  html.append("<ul>");

  router.documentation().forEach(doc ->
      html.append("<li>")
          .append("<b>Method</b>: ")
          .append(doc.getHttpMethod())
          .append("  <b>Path</b>: ")
          .append(doc.getPathPattern())
          .append("  <b>Controller</b>: ")
          .append(doc.getControllerMethodInvocation())
          .append("</li>"));

  html.append("</ul>");
}

更新Play 2.7,Scala:

class MyController @Inject()(routesProvider: Provider[play.api.routing.Router]) { lazy val routes: Seq[(String, String, String)] = routesProvider.get.documentation }

从讨论开始2.6

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM