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