Playframework 2.0 播放框架招摇过市UI集成错误

Playframework 2.0 播放框架招摇过市UI集成错误,playframework-2.0,swagger,Playframework 2.0,Swagger,我正在尝试为PlayFramework2.5.x提供的RESTAPI集成Swagger UI 我做了以下工作: 在my build.sbt中包含以下依赖项 将以下内容添加到我的路线中: 然后我尝试访问swagger.json 以下是我得到的错误: [error] application - ! @77515gnlp - Internal server error, for (GET) [/swagger.json] -> play.api.http.HttpErrorHandlerEx

我正在尝试为PlayFramework2.5.x提供的RESTAPI集成Swagger UI

我做了以下工作:

  • 在my build.sbt中包含以下依赖项
  • 将以下内容添加到我的路线中:
  • 然后我尝试访问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)
    

    还有什么我应该添加或查看的吗?

    您似乎没有在
    应用程序中启用swagger模块。conf

    play.modules.enabled += "play.modules.swagger.SwaggerModule"
    
    我建议您参考这篇伟大的博客文章,了解与play框架的正确集成:


    祝你好运:)

    看了你的项目一段时间后,我发现你面临的问题是什么。基本上,Play Swagger模块提供了一个Guice绑定来初始化自己,而您在库中似乎没有使用该绑定,因此该模块无法初始化自己,然后在运行时出现错误。我将向PlaySwigger报告这一问题(应该写在文档中)

    具体情况是:

  • 实例化新服务器时,Play将初始化Guice
  • Guice将寻找任何模块来进行依赖项注入
  • Guice将注入
    SwaggerPlugin
    (播放Swagger)
  • 服务器已启动
  • http://localhost:9000/swagger.json
    GET请求已处理
  • Swagger Play查找API元数据,但从未设置此元数据
  • Swagger Play调用的方法尝试访问Swagger核心库Swagger API的
    null
    静态变量
  • 那么为什么该变量为空?

    嗯,Play-Swagger库依赖于Java-lib-Swagger核心,因此在设置时,它将为静态方法分配一个值,从而期望在运行时设置该变量

    出了什么问题?

    不幸的是,PlaySwagger和Play一样依赖于Guice和Swagger-javalib,带来了Java语言的问题:静态变量和空指针异常。它还依赖于OpenAPI 2,而不是最近的OpenAPI 3

    我有什么建议?

    也许可以尝试使用iHeartRadio的招摇过市,乍一看它似乎更轻量级,而且不使用Guice。另外,根据我的经验,我更喜欢在
    路由
    文件上使用yml注释,而不是注释,这可以防止整个应用程序出现编译和运行时错误,但这会使调试更加困难,因为它无法无声地生成
    swagger.json
    文件。我建议您尝试使用替代安装在运行时生成
    swagger.json
    。链接:


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

    我尝试重新创建一个项目,只是添加了端点和依赖项。我注意到你同样的错误,但是在添加配置之后,它被它修复了。您可以添加更多信息或项目示例吗?引用的链接是固定链接@slashdottir如链接中所述,此参考现在可能已过时。我仍然希望这个答案可能会有所帮助。但另一方面,这实际上意味着插件没有初始化,而另一个答案对其他有问题的人也是有效的。
    [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)
    
    play.modules.enabled += "play.modules.swagger.SwaggerModule"