以编程方式获取Play! Framework 2.5.x中的路由

7
play-swagger模块中,我们使用play.routes.compiler.RoutesFileParser来获取Play中所有已注册的路由,并进一步解析它们以生成API文档:
val parsedRoutes = RoutesFileParser.parse(new File(app.classloader.getResource(routesFile).toURI))
val routes = parsedRoutes.right.get.collect {
  case (route: PlayRoute) => {
    logger.debug(s"Adding route '$route'")
    Seq(route.copy(path = route.path.copy(parts = StaticPart(prefix + "/") +: route.path.parts)))
  }
  case (include: PlayInclude) => {
    logger.debug(s"Processing route include $include")
    parseRoutesHelper(playRoutesClassNameToFileName(include.router), include.prefix)
  }
}.flatten

这会导致以下错误:java.lang.NoClassDefFoundError: play/routes/compiler/RoutesFileParser

看起来在Play! 2.5中RoutesFileParser变成了私有的。
如何以正确的方式获取所有类似于上面示例中的Play路由呢?

1
我已经检查了RoutesFileParser的git历史记录,没有发现与2.4.0有关的重要更改。该对象是公共的,具有公共解析方法,类是私有的,就像play 2.4.0一样。https://github.com/playframework/playframework/commits/master/framework/src/routes-compiler/src/main/scala/play/routes/compiler/RoutesFileParser.scala 这不是您问题的答案,但也许问题出在其他地方,如缺少库、错误版本等。 - Jonas Anso
2个回答

1
这绝对是一个依赖问题。检查依赖树。
如果还没有,请将以下内容添加到构建文件中:
"com.typesafe.play" %% "routes-compiler" % "2.5.0"

然后这个程序将能够编译和运行:

val routesURI = app.classloader.getResource("routes").toURI
val parsedRoutes = play.routes.compiler.RoutesFileParser.parse(new File(routesURI))
println(parsedRoutes)

(其中app是play.api.Application的运行实例)


0
在查看Play的源代码时,我发现可以使用以下内容:
class HomeController @Inject() (router: Provider[Router]) {
....
    router.get().documentation.foreach(println)
....
}

这将打印出带有HTTP方法、路径和方法调用的字符串元组。这就是DEV 404页面上路由呈现的方式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接