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

时间:2017-06-20 10:01:38

标签: scala playframework

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

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

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

3 个答案:

答案 0 :(得分:6)

我使用路由器特征提供的documentation方法获得了所需的列表。文档方法返回Seq[(String, String, String)]。每个元组的格式为:

  

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

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

因此,要获取所有网址的列表,我只需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)
}

答案 1 :(得分:0)

对于已接受的答案:请注意,如果您在Controller中工作,并尝试注入Router,则会收到循环依赖错误(因为Router取决于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>");
}

答案 2 :(得分:0)

Scala Play 2.7更新:

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

from discussion for play 2.6