我正在尝试集成由Play Framework 2.5.x
提供的REST API的Swagger UI我做了以下操作:
- 在我的build.sbt中包括以下依赖项
"io.swagger" %% "swagger-play2" % "1.5.3" "org.webjars" %% "webjars-play" % "2.5.0-4" "org.webjars" % "swagger-ui" % "2.2.0"
- 在我的路线上添加以下内容:
GET /swagger.json controllers.ApiHelpController.getResources GET /docs/ controllers.Assets.at(path="/public/swagger-ui",file="index.html") GET /docs/*file controllers.Assets.at(path="/public/swagger-ui",file)
- 然后我尝试访问Swagger.json
这是我遇到的错误:
[error] application -
! @77515gnlp - Internal server error, for (GET) [/swagger.json] ->
play.api.http.HttpErrorHandlerExceptions$$anon$1: Execution exception[[NullPointerException: null]]
at play.api.http.HttpErrorHandlerExceptions$.throwableToUsefulException(HttpErrorHandler.scala:280)
at play.api.http.DefaultHttpErrorHandler.onServerError(HttpErrorHandler.scala:206)
at play.core.server.netty.PlayRequestHandler$$anonfun$2$$anonfun$apply$1.applyOrElse(PlayRequestHandler.scala:100)
at play.core.server.netty.PlayRequestHandler$$anonfun$2$$anonfun$apply$1.applyOrElse(PlayRequestHandler.scala:99)
at scala.concurrent.Future$$anonfun$recoverWith$1.apply(Future.scala:346)
at scala.concurrent.Future$$anonfun$recoverWith$1.apply(Future.scala:345)
at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:36)
at play.api.libs.iteratee.Execution$trampoline$.execute(Execution.scala:70)
at scala.concurrent.impl.CallbackRunnable.executeWithValue(Promise.scala:44)
at scala.concurrent.impl.Promise$DefaultPromise.tryComplete(Promise.scala:252)
Caused by: java.lang.NullPointerException: null
at play.modules.swagger.ApiListingCache$$anonfun$listing$1.apply(ApiListingCache.scala:15)
at play.modules.swagger.ApiListingCache$$anonfun$listing$1.apply(ApiListingCache.scala:11)
at scala.Option.orElse(Option.scala:289)
at play.modules.swagger.ApiListingCache$.listing(ApiListingCache.scala:11)
at controllers.SwaggerBaseApiController.getResourceListing(ApiHelpController.scala:128)
at controllers.ApiHelpController$$anonfun$getResources$1.apply(ApiHelpController.scala:74)
at controllers.ApiHelpController$$anonfun$getResources$1.apply(ApiHelpController.scala:71)
at play.api.mvc.ActionBuilder$$anonfun$apply$13.apply(Action.scala:371)
at play.api.mvc.ActionBuilder$$anonfun$apply$13.apply(Action.scala:370)
at play.api.mvc.Action$.invokeBlock(Action.scala:498)
我还应该添加或查看吗?
您似乎没有启用application.conf
中的Swagger模块:
play.modules.enabled += "play.modules.swagger.SwaggerModule"
我建议您参考这篇很棒的博客文章,以与Play Framework正确整合:Medive Article
祝你好运:(
查看您的项目后,我弄清楚了您面临的问题。基本上,Play Swagger模块提供了 GUICE 绑定至初始化本身,您似乎在库中不使用,因此模块无法初始化,然后在运行时会出现错误。我将把这作为玩游戏的问题(应该写在文档中(。
到底发生的是:
- 实例化新服务器时,Play将初始化Guice
- Guice将寻找任何模块进行依赖注入
- Guice将注入
SwaggerPlugin
(Play Swagger(https://github.com/swagger-api/swagpi/swagger-play/blob/master/master/play-2.6/swagger-2.6/swagger-play2/app/play/modules/modules/modules/swagggermodule。Scala#l11 - 启动服务器
-
http://localhost:9000/swagger.json
获取请求已处理 - Swagger Play的API Metadata寻找,但这从来没有设置为https://github.com/swagger-api/swagpi/swagger-play/blob/master/master/play-2.6/swagger-2.6/swagger-play2/app/play/play/modules/modules/swagger/apilistingcache.scala#l14
- Swagger Play所调用的方法试图访问Swagger Core库的
null
静态变量,Swagger API https://github.com/swagger-api/swagger-api/swagger/swagger/swagger/blob/1.5/modules/modules/swagger-core/swagger-core/src/main/java/io/swagger/config/scannerfactory.java#l4
那么为什么变量为null?
好吧,Play Swagger库依赖于Java Lib Swagger Core,因此在设置时,它将为静态方法分配一个值,从而期望将变量设置为运行时。
出了什么问题?
不幸的是,Playwagger(例如Play(依靠Guice和Swagger Java Lib,带来了Java语言的问题:静态变量和Null指针异常。此外,它依赖于Openapi 2而不是最近的OpenApi 3。
我建议什么?
也许尝试使用Iheartradio的招摇,一见一见钟情,它似乎更轻巧,而不是使用Guice。同样,根据我的经验,我更喜欢在routes
文件上使用YML注释,而不是注释,这可以防止整个应用程序的编译和运行时错误,但是它使调试变得更加困难,因为它只是无法默默生成swagger.json
文件。我建议您尝试使用替代安装在运行时生成swagger.json
。链接:https://github.com/iheartradio/play-swagger/blob/master/master/docs/alternativeetup.md
祝你好运,希望这很有帮助。