【问题标题】:Swagger.json is not generated in Jersey + Tomcat8Jersey + Tomcat8 中不生成 Swagger.json
【发布时间】:2018-04-10 09:37:40
【问题描述】:

pom.xml

<dependency>
                <groupId>io.swagger</groupId>
                <artifactId>swagger-jersey2-jaxrs</artifactId>
                <version>1.5.7</version>
                <exclusions>
                    <exclusion>
                        <groupId>org.glassfish.jersey.containers</groupId>
                        <artifactId>jersey-container-servlet-core</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
    id="WebApp_ID" version="3.1">


    <servlet>
        <servlet-name>Jersey Web Application</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>io.swagger.jaxrs.listing,
            rs
            </param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Jersey Web Application</servlet-name>
        <url-pattern>/webapi/*</url-pattern>
    </servlet-mapping>



     <servlet>
        <servlet-name>Jersey2Config</servlet-name>
        <servlet-class>io.swagger.jersey.config.JerseyJaxrsConfig</servlet-class>
        <init-param>
            <param-name>api.version</param-name>
            <param-value>1.0</param-value>
        </init-param>

        <init-param>
            <param-name>swagger.api.title</param-name>
            <param-value>Swagger APIzz</param-value>
        </init-param>
        <init-param>
            <param-name>swagger.api.basepath</param-name>
            <param-value>http://localhost:8080/SwaggerExample/webapi</param-value>
        </init-param>
        <init-param>
            <param-name>swagger.pretty.print</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <param-name>swagger.scan</param-name>
            <param-value>true</param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
    </servlet> 
</web-app>

SwaggerExample 是上下文根

PeopleRestService.java 存在于 rs 包中

@Path( "/people" ) 
@Api( value = "/", description = "Manage people" )
public class PeopleRestService {

     private static PeopleService peopleService;

    static{
        peopleService = new PeopleService();
    }

    @Produces( { MediaType.APPLICATION_JSON } )
    @GET
    @ApiOperation( value = "List all people", notes = "List all people using paging", response = Person.class, responseContainer = "List")
    public Collection< Person > getPeople(  @ApiParam( value = "Page to fetch", required = true ) @QueryParam( "page") @DefaultValue( "1" ) final int page ) {
        System.out.println("inside service........");
        return peopleService.getPeople( page, 100 );
    }
}

上面的代码可以通过webservice 获取数据,但是在访问 swagger.json 时,它给出了 404

http://localhost:8080/SwaggerExample/webapi/people:工作正常

http://localhost:8080/SwaggerExample/webapi/swagger.json : 正在给 404

【问题讨论】:

    标签: java maven jersey swagger tomcat8


    【解决方案1】:

    如果您可以在 swagger UI 上看到您的 API,这意味着 swagger UI 知道您的 swagger.json 在哪里,在我的情况下,我去了 index.html 并搜索了 swagger.json

    我找到了这段代码

    var url = window.location.search.match(/url=([^&]+)/);
    if (url && url.length > 1) {
        url = decodeURIComponent(url[1]);
    } else {
        url = "/my-app-name/app/swagger.json"; << this
    }
    

    编辑 1:

    newer versions 你会发现类似

      const ui = SwaggerUIBundle({
      url: "http://petstore.swagger.io/v2/swagger.json", << this
      dom_id: '#swagger-ui',
      deepLinking: true,
      presets: [
        SwaggerUIBundle.presets.apis,
        SwaggerUIStandalonePreset
      ],
      plugins: [
        SwaggerUIBundle.plugins.DownloadUrl
      ],
      layout: "StandaloneLayout"
    })
    

    我想您还必须相应地替换您的init-param,以便您可以远程访问它。

    <param-value>http://localhost:8080/SwaggerExample/webapi</param-value>
    

    到相对路径

    <param-value>/SwaggerExample/webapi</param-value>
    

    【讨论】:

    • 不,我已经删除了 localhost:8080 但它仍然无法正常工作。
    【解决方案2】:

    在 web.xml 中替换

    <init-param>
                <param-name>jersey.config.server.provider.packages</param-name>
                <param-value>io.swagger.jaxrs.listing,
                rs
                </param-value>
            </init-param>
    

    <init-param>
                <param-name>javax.ws.rs.Application</param-name>
                <param-value>
                   services.ConfigApplication
                </param-value>
            </init-param> 
    

    并显式注册类

    class ConfigApplication extends ResourceConfig{
    
        public ConfigApplication(){
    
            register(ApiListingResource.class);
            register(SwaggerSerializers.class);
            register(PeopleRestService.class);
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2016-06-21
      • 1970-01-01
      • 2015-08-06
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 2019-02-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多