【问题标题】:Swagger.json not getting fed to swagger uiSwagger.json 没有被喂到 swagger ui
【发布时间】:2018-04-26 08:14:49
【问题描述】:

作为新手,我尝试通过此链接将 swagger-core 与我的 rest api 集成 -> https://github.com/swagger-api/swagger-core/wiki/Swagger-Core-Jersey-2.X-Project-Setup-1.5

BeanConfig 的 setScan 函数面临一些问题,因此降级了反射包,如下面的 maven 文件所示:

    <dependency>
         <groupId>io.swagger</groupId>
         <artifactId>swagger-jaxrs</artifactId>
         <version>1.5.18</version>
         <exclusions>
             <exclusion>
                 <groupId>org.reflections</groupId>
                 <artifactId>reflections</artifactId>
             </exclusion>
         </exclusions>
    </dependency>
    <dependency>
        <groupId>org.reflections</groupId>
        <artifactId>reflections</artifactId>
        <version>0.9.10</version>
    </dependency>
    <dependency>
         <groupId>org.webjars</groupId>
         <artifactId>swagger-ui</artifactId>
         <version>3.13.6</version>
         <scope>runtime</scope>
    </dependency>

这是应用程序的启动方法:

 public void start() throws Exception {
       BeanConfig beanConfig = new BeanConfig();
       beanConfig.setVersion("2.0");
       beanConfig.setSchemes(new String[]{"http"});
       beanConfig.setHost("0.0.0.0:8082");
       beanConfig.setBasePath("/test");
       beanConfig.setResourcePackage("io.confluent.kafkarest.resources");
       beanConfig.setScan(true);
       beanConfig.setPrettyPrint("true");
       if (server == null) {
         createServer();
       }
    server.start();
  }

通过这个,我能够在根路径生成 swagger.json。 现在,我想将此 json 提供给 swagger ui ,所以我在 maven pom.xml 中添加了依赖关系,如上所示。并修改如下代码:

      public void start() throws Exception {
           BeanConfig beanConfig = new BeanConfig();
           beanConfig.setVersion("2.0");
           beanConfig.setSchemes(new String[]{"http"});
           beanConfig.setHost("0.0.0.0:8082");
           beanConfig.setBasePath("/test");
           beanConfig.setResourcePackage("io.confluent.kafkarest.resources");
           beanConfig.setScan(true);
           beanConfig.setPrettyPrint("true");
           if (server == null) {
             createServer();
           }
        server.setHandler(buildSwaggerUI()); //--> added this method call.
        server.start();
      }

      public static ContextHandler buildSwaggerUI() throws Exception {
        ResourceHandler rh = new ResourceHandler();
        rh.setResourceBase(KafkaRestApplication.class.getClassLoader()
            .getResource("META-INF/resources/webjars/swagger-ui/3.13.6")
            .toURI().toString());
        ContextHandler context = new ContextHandler();
        context.setContextPath("/swagger");
        context.setHandler(rh);
        return context;
      }

在此之后,我能够获得相当默认的 swagger ui,但现在 swagger.json 已经消失了。我不再得到 swagger.json 了。我试着关注这个博客: https://danielflower.github.io/2016/04/01/Swagger-with-embedded-jetty-without-magic.html

我真的很难让 swagger ui 与 swagger json 规范一起工作。我觉得我错过了一些愚蠢的东西?请帮忙。

【问题讨论】:

    标签: java json swagger swagger-ui


    【解决方案1】:

    我通过this 链接让它工作了。我的工作代码看起来像这样:

          public void start() throws Exception {
               BeanConfig beanConfig = new BeanConfig();
               beanConfig.setVersion("2.0");
               beanConfig.setSchemes(new String[]{"http"});
               beanConfig.setHost("0.0.0.0:8082");
               beanConfig.setBasePath("/test");
               beanConfig.setResourcePackage("io.confluent.kafkarest.resources");
               beanConfig.setScan(true);
               beanConfig.setPrettyPrint("true");
               if (server == null) {
                 createServer();
               }
            final HandlerList handlers = new HandlerList();
            handlers.addHandler(buildSwaggerUI());
            handlers.addHandler(buildContext());
            server.setHandler(handlers);
            server.start();
          }
    
          private static ContextHandler buildContext() {
            ResourceConfig resourceConfig = new ResourceConfig().packages(WS_PACKAGE, "io.swagger.jaxrs.listing");
            ServletContainer servletContainer = new ServletContainer(resourceConfig);
            ServletHolder eBrowser = new ServletHolder(servletContainer);
            ServletContextHandler eContext = new ServletContextHandler(ServletContextHandler.SESSIONS);
            eContext.setContextPath("/");
            eContext.addServlet(eBrowser, "/*");
    
            return eContext;
          }
    
          public static ContextHandler buildSwaggerUI() throws Exception {
            ResourceHandler rh = new ResourceHandler();
            rh.setResourceBase(KafkaRestApplication.class.getClassLoader()
                .getResource("META-INF/resources/webjars/swagger-ui/3.13.6")
                .toURI().toString());
            ContextHandler context = new ContextHandler();
            context.setContextPath("/swagger");
            context.setHandler(rh);
            return context;
          }
    

    【讨论】:

    • 这是一个有用的例子,谢谢。不过我确实有一个问题。我有一个和你类似的应用程序。我可以访问 localhost:8080/swagger.json 上的 swagger.json 文件,但无法通过 localhost:8080/swagger 访问 swagger-ui。引发 HTTP 500 错误。还有什么需要做的吗?