我的播放2.4.x 应用程序中有很多控制器。
我想获得指向各自控制器的all route URLs
列表。我知道如何从当前请求中获取URL。但我需要一个播放应用程序中可用的所有URL列表。我想generate this list dynamically because URLs can be changed/added/deleted in future
。
那么,有什么方法可以动态生成这个URL列表吗?或者我是否有义务将所有URL静态存储在缓存或字典中的某个位置?
答案 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
}