Play Framework Swagger UI集成错误



我正在尝试集成由Play Framework 2.5.x

提供的REST API的Swagger UI

我做了以下操作:

  1. 在我的build.sbt中包括以下依赖项
  "io.swagger" %% "swagger-play2" % "1.5.3"
  "org.webjars" %% "webjars-play" % "2.5.0-4"
  "org.webjars" % "swagger-ui" % "2.2.0"
  1. 在我的路线上添加以下内容:
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)
  1. 然后我尝试访问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 绑定至初始化本身,您似乎在库中不使用,因此模块无法初始化,然后在运行时会出现错误。我将把这作为玩游戏的问题(应该写在文档中(。

到底发生的是:

  1. 实例化新服务器时,Play将初始化Guice
  2. Guice将寻找任何模块进行依赖注入
  3. 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
  4. 启动服务器
  5. http://localhost:9000/swagger.json获取请求已处理
  6. 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
  7. 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

祝你好运,希望这很有帮助。

最新更新