2016-03-18 16 views
7

Nel modulo play-swagger, abbiamo usato il play.routes.compiler.RoutesFileParser per ottenere tutte le rotte registrati dal gioco e in seguito li analizzare a una documentazione API:Ottieni percorsi automaticamente in Play! 2.5.x quadro

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 

Il risultato è il seguente errore: java.lang.NoClassDefFoundError: play/routes/compiler/RoutesFileParser

Sembra che lo RoutesFileParser sia diventato privato in Play! 2.5.

Qual è il modo corretto di recuperare tutti i percorsi di riproduzione come nell'esempio sopra riportato?

+1

Ho controllato la cronologia git di RoutesFileParser e non ho trovato nessuna modifica importante da 2.4.0. L'oggetto è pubblico con il metodo di analisi pubblico e la classe è privata come per il gioco 2.4.0. https://github.com/playframework/playframework/commits/master/framework/src/routes-compiler/src/main/scala/play/routes/compiler/RoutesFileParser.scala Non è una risposta alla tua domanda ma forse il il problema è altrove, librerie mancanti, versioni sbagliate, ... –

risposta

1

Questo è sicuramente un problema di dipendenza. Controlla la dependencyTree.

Se non è già lì, quindi aggiungere il seguente al file di generazione:

"com.typesafe.play" %% "routes-compiler" % "2.5.0" 

allora questo sarà compilare ed eseguire bene:

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

(dove app è un'istanza in esecuzione di gioco .api.Application)

0

Guardando attraverso il codice sorgente di Play, ho scoperto che posso usare quanto segue:

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

Questo stamperà tuple di stringhe con metodo HTTP, percorso, richiamo del metodo. Ecco come vengono renderizzati i percorsi sulla pagina DEV 404.