【问题标题】:Why is the swagger ui not showing my annotated REST methods?为什么 swagger ui 没有显示我带注释的 REST 方法?
【发布时间】:2015-08-17 17:40:20
【问题描述】:

我在配置 swagger 以查看我的 REST 方法时遇到问题。我在 Eclipse 和 Tomcat 7 中工作。我有以下简单的 REST 方法/类:

package com.rest;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import com.wordnik.swagger.annotations.Api;
import com.wordnik.swagger.annotations.ApiOperation;

@Api( value="/", description="Say hello class")
@Path("/")
public class Hello {

    @GET
    @Path("/hello")
    @ApiOperation(value="/hello", notes="hello method")
    public String sayHello() {
        return "Hello World!";
    }
}

我正在使用以下 web.xml

   <?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:javaee="http://java.sun.com/xml/ns/javaee"
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
    <display-name>SwaggerTest</display-name>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
    <servlet>
        <servlet-name>Jersey REST Service</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>com.wordnik.swagger.jaxrs.json,com.rest</param-value>
        </init-param>
        <init-param>
            <param-name>jersey.config.server.provider.classnames</param-name>
            <param-value>
                com.wordnik.swagger.jersey.listing.ApiListingResourceJSON,
                com.wordnik.swagger.jersey.listing.JerseyApiDeclarationProvider,
                com.wordnik.swagger.jersey.listing.JerseyResourceListingProvider
            </param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Jersey REST Service</servlet-name>
        <url-pattern>/api/*</url-pattern>
    </servlet-mapping>


    <servlet>
        <servlet-name>SwaggerJerseyJaxrsConfig</servlet-name>
        <servlet-class>com.wordnik.swagger.jersey.config.JerseyJaxrsConfig</servlet-class>
        <init-param>
            <param-name>api.version</param-name>
            <param-value>0.0.1</param-value>
        </init-param>
        <init-param>
            <param-name>swagger.api.basepath</param-name>
            <param-value>http://localhost:8080/api/</param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
    </servlet>

</web-app>

其余服务在http://localhost:8080/SwaggerTest/api/sayHello 上可用,并在浏览器中显示正确的消息。该服务的 Swagger 规范可在 http://localhost:8080/SwaggerTest/api-docs 获得。但是,返回的只是

{"apiVersion":"0.0.1","swaggerVersion":"1.2","apis":[{"path":"/","description":"Say hello class"}]}

GET sayHello() 方法发生了什么?或者这就是它应该返回的全部内容?

任何帮助将不胜感激。提前致谢。

大卫

附: maven 依赖项是

<dependencies>
    <dependency>
        <groupId>org.glassfish.jersey.core</groupId>
        <artifactId>jersey-server</artifactId>
        <version>2.7</version>
    </dependency>

    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-multipart</artifactId>
        <version>2.7</version>
    </dependency>

    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
        <version>2.7</version>
    </dependency>

    <dependency>
        <groupId>com.wordnik</groupId>
        <artifactId>swagger-jersey2-jaxrs_2.10</artifactId>
        <version>1.3.12</version>
    </dependency>

    <dependency>
        <groupId>org.webjars</groupId>
        <artifactId>swagger-ui</artifactId>
        <version>2.1.1</version>
    </dependency>

    <dependency>
        <groupId>com.wordnik</groupId>
        <artifactId>swagger-servlet_2.10</artifactId>
        <version>1.3.12</version>
    </dependency>

    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet-core</artifactId>
        <version>2.7</version>
    </dependency>


</dependencies>

【问题讨论】:

  • 我的 \@Api 和 \@ApiOperation 注释的“值”属性值不正确,但修复此问题并没有改变。更改为 'value="/"' 和 'value="/sayHello"'。同样,这无济于事。
  • 您的 web.xml 已将所有与 swagger 相关的内容都注释掉了。你到底希望发生什么?此外,您使用的是旧版本的 swagger-core,以及一组奇怪的依赖项。不知道你是如何得到这个配置的。
  • 我更新了帖子以正确使用球衣(我希望)。

标签: java rest jersey swagger


【解决方案1】:

问题在于您使用的是 swagger-core 1.3,它会生成 Swagger 1.2 定义。 Swagger 1.2 不太喜欢基于根 (/) 的 API。如果您将@Apivalue 更改为“/”以外的任何内容,您仍然可以显示它。这不会影响 API 本身,只会影响文档的托管方式。

如果你给它例如“/root”的value,然后转到http://localhost:8080/SwaggerTest/api-docs/root - 你会看到你暴露的服务。

此外,您通常使用的是旧版本的 swagger-core 和 Swagger。您似乎正在尝试与 Jersey 集成,因此您可以按照 https://github.com/swagger-api/swagger-core/wiki/Swagger-Core-Jersey-1.X-Project-Setup-1.5 作为您的集成指南。这会产生 Swagger 2.0,它与根资源没有相同的问题。

【讨论】:

    【解决方案2】:

    我没有告诉 jersey 大摇大摆地检查正确的包裹。特别是com.wordnik.swagger.jaxrs.listing,必须添加如下:

    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>com.ibm.dipo.rest,
                    com.wordnik.swagger.jaxrs.listing</param-value>
    </init-param>
    

    然后

    1. 已将 swagger dist 树 (https://github.com/swagger-api/swagger-ui/tree/master/dist) 加载到我的 WebContent 目录中,
    2. 将其重命名为 api-docs,
    3. 修改 index.html 以指向 swagger 的 api-docs 位置:

      $(函数(){ var url = window.location.search.match(/url=([^&]+)/);

        if (url && url.length > 1) {
          url = decodeURIComponent(url[1]);
        } else {
          url = "http://petstore.swagger.io/v2/swagger.json";
          url = "../../api/BlueHound/api-docs"
        }
      

    通过这些更改,我的 swagger 文档可在 http://localhost:8080/RTSServices/api-docs/index.html 获得

    完整的 web.xml 如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:javaee="http://java.sun.com/xml/ns/javaee"
        xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
        <display-name>RTSServices</display-name>
        <welcome-file-list>
            <welcome-file>index.jsp</welcome-file>
        </welcome-file-list>
        <servlet>
            <servlet-name>Jersey REST Service</servlet-name>
            <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
            <init-param>
                <param-name>jersey.config.server.provider.packages</param-name>
                <param-value>com.ibm.dipo.rest,
                            com.wordnik.swagger.jaxrs.listing</param-value>
            </init-param>
    
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>Jersey REST Service</servlet-name>
            <url-pattern>/api/BlueHound/*</url-pattern>
        </servlet-mapping>
    
        <servlet>
            <servlet-name>SwaggerJerseyJaxrsConfig</servlet-name>
            <servlet-class>com.wordnik.swagger.jersey.config.JerseyJaxrsConfig</servlet-class>
            <init-param>
                <param-name>api.version</param-name>
                <param-value>0.0.1</param-value>
            </init-param>
            <init-param>
                <param-name>swagger.api.basepath</param-name>
                <param-value>http://localhost:8080/RTSServices/api/BlueHound/</param-value>
            </init-param>
            <load-on-startup>2</load-on-startup>
        </servlet>
    
    </web-app>
    

    【讨论】:

    • 对于 Ron 的回答,我不必更改任何 maven 依赖项。
    • 我认为你应该接受这个答案(你自己的)作为你问题的答案......
    猜你喜欢
    • 1970-01-01
    • 2016-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 2019-09-04
    • 1970-01-01
    相关资源
    最近更新 更多