2016-03-18 70 views
7

play-swagger模塊,我們使用了play.routes.compiler.RoutesFileParser讓所有註冊的路線從播放,並進一步把它解析到一個API文檔:以編程方式獲取Play中的路線!框架2.5.X

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

看起來RoutesFileParser在Play中變成了私密! 2.5。

上述示例中提取所有播放路線的正確方法是什麼?

+1

我檢查過RoutesFileParser的git歷史記錄,並沒有從2.4.0中找到任何重要的改變。該對象是公開的公共解析方法,該類是私有的,因爲它是用於播放2.4.0。 https://github.com/playframework/playframework/commits/master/framework/src/routes-compiler/src/main/scala/play/routes/compiler/RoutesFileParser.scala這不是你的問題的答案,但也許是問題在別處,缺少圖書館,錯誤的版本,... –

回答

1

這絕對是一個依賴性問題。檢查dependencyTree。

如果不是已經存在,然後添加以下到生成文件:

"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) 

(其中應用是遊戲的運行實例.api.Application)

0

查看Play的源代碼時,發現我可以使用以下代碼:

class HomeController @Inject() (router: Provider[Router]) { 
.... 
    router.get().documentation.foreach(println) 
.... 
} 

這將打印出帶有HTTP方法,路徑,方法調用的字符串元組。這是DEV 404頁面上路由的呈現方式。

相關問題