2016-03-18 16 views
7

W module play-swagger użyliśmy play.routes.compiler.RoutesFileParser się wszystkie dotychczas zarejestrowane trasy z gry i dalej analizować je do dokumentacji API:Programowo uzyskać trasy w grze! Ramy 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 

Wynika to w następujący błąd: java.lang.NoClassDefFoundError: play/routes/compiler/RoutesFileParser

Wygląda na to, że RoutesFileParser stał się prywatny w Play! 2.5.

Jaki jest prawidłowy sposób pobierania wszystkich tras odtwarzania, jak w powyższym przykładzie?

+1

Sprawdziłem historię git programu RoutesFileParser i nie znalazłem żadnej ważnej zmiany z wersji 2.4.0. Obiekt jest publiczny z metodą analizowania publicznego, a klasa jest prywatna, tak jak w przypadku gry 2.4.0. https://github.com/playframework/playframework/commits/master/framework/src/routes-compiler/src/main/scala/play/routes/compiler/RoutesFileParser.scala To nie jest odpowiedź na twoje pytanie, ale może problem jest gdzie indziej, brakujące biblioteki, złe wersje, ... –

Odpowiedz

1

Jest to zdecydowanie problem zależności. Sprawdź dependencyTree.

Jeśli nie jest już tam, a następnie dodaj następujące do pliku produkcji:

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

Wtedy to skompilować i uruchomić ładnie:

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

(gdzie aplikacja jest uruchomiona instancja zaawansowania .api.Application)

0

Gdy pominie kodu źródłowego gry, odkryłem, że mogę korzystać z następujących powodów:

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

Spowoduje to wypisanie krotek String za pomocą metody HTTP, ścieżki, wywołania metody. W ten sposób renderowane są trasy na stronie DEV 404.