【问题标题】:REST API - Swagger + Java + Jersey wrong listing path and additional apisREST API - Swagger + Java + Jersey 错误的列表路径和额外的 api
【发布时间】:2013-01-10 16:31:14
【问题描述】:

在我的项目中,我使用 Maven、Jetty、Swagger、Java 和 Jersey 来创建 REST API。 我还使用 Swagger 为我的 API 创建漂亮的文档。

几乎一切都好,而不是三个问题。 一开始 - 这是我的 web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    version="2.5">
    <display-name>Restful Web Application</display-name>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>

    <listener>
        <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>

    <listener>
        <listener-class>
            org.springframework.web.context.request.RequestContextListener
        </listener-class>
    </listener>

    <servlet>
        <servlet-name>jersey-serlvet</servlet-name>
        <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>

        <init-param>
            <param-name>com.sun.jersey.config.property.packages</param-name>
            <param-value>com.pjdb.rest;com.wordnik.swagger.jaxrs;</param-value>
        </init-param>

        <init-param>
            <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
            <param-value>true</param-value>
        </init-param>

        <init-param>
            <param-name>api.version</param-name>
            <param-value>1.0</param-value>
        </init-param>

        <init-param>
            <param-name>swagger.api.basepath</param-name>
            <param-value>http://localhost:8080/rest</param-value>
        </init-param>

        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet>
        <servlet-name>Bootstrap</servlet-name>
        <servlet-class>com.pjdb.rest.Bootstrap</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>jersey-serlvet</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>

    <filter>
        <filter-name>ApiOriginFilter</filter-name>
        <filter-class>com.pjdb.rest.utils.ApiOriginFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>ApiOriginFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

</web-app>

1) 如何去掉listingPath开头的api-docs?

{
  "apiVersion": "1.0",
  "swaggerVersion": "1.1",
  "basePath": "http://localhost:8080/rest",
  "apis": [
    {
      "path": "/api-docs/resources",
      "description": ""
    },
    {
      "path": "/api-docs/employee",
      "description": ""
    }
  ]
}

我想删除路径开头的 /api-docs..

2) 如何从 api 中删除“/api-docs/resources”?我只使用“员工”类,而不使用“资源”。

3) 如果我输入 http://localhost:8080/rest/api-docs/employee 我有我的方法 和“/”主 URL,它是空的。我可以删除它吗?

我尝试了很多配置。我错过了什么吗?

【问题讨论】:

  • 接受一些答案怎么样?

标签: java rest jersey jetty swagger


【解决方案1】:

我是这样解决的:

  1. 将 Swagger 生成的 api-docs.json 保存到硬盘
  2. 根据需要编辑生成的 JSON
  3. 将此文件复制到~/src/main/webapp/swagger-ui/api-docs.json
  4. http://localhost:8080/swagger-ui/api-docs.json 放入您的discoveryUrl 路径中的index.html 中的/swagger-ui 目录中

这个方法需要你,你必须自己修改你的主列表 如果有任何变化,但它是安全且有效的解决方案。

我的 api-docs.json 看起来像这样:

{
    "apiVersion": "1.0",
    "swaggerVersion": "1.1",
    "basePath": "http://localhost:8080/rest",
    "apis": [
        {
            "path": "/api-docs.json/employee",
            "description": ""
        }
    ]
}

swagger-ui/index.html 设置

<script type="text/javascript">
    $(function () {
        window.swaggerUi = new SwaggerUi({
            discoveryUrl:"http://localhost:8080/swagger-ui/api-docs.json",
            apiKey:"special-key",
            dom_id:"swagger-ui-container",
            supportHeaderParams: false,
            supportedSubmitMethods: ['get', 'post', 'put'],
            onComplete: function(swaggerApi, swaggerUi){
                if(console) {
                    console.log("Loaded SwaggerUI")
                    console.log(swaggerApi);
                    console.log(swaggerUi);
                }
              $('pre code').each(function(i, e) {hljs.highlightBlock(e)});
            },
            onFailure: function(data) {
                if(console) {
                    console.log("Unable to Load SwaggerUI");
                    console.log(data);
                }
            },
            docExpansion: "none"
        });

        window.swaggerUi.load();
    });

</script>

【讨论】:

    【解决方案2】:

    尽管我不是 Swagger 专家,但我会尽力回答您的所有三个问题。我还建议与 IRC 上的 Swagger 开发人员交谈——他们的响应速度非常快。我认为让 Swagger “自动”工作是值得的,这样您就不必手动更新它——这对我来说似乎不是最佳选择。

    1) 您不想在列表路径中删除 api-docs - 您希望列表具有某种唯一名称。它不必是 api-docs - 例如,我使用 resources - 但您需要某种前缀来区分您的实际 REST 资源和它们的描述,在 Swagger 上。所以我认为这根本不是问题。

    2) 您是否有一个扩展com.wordnik.swagger.jaxrs.JavaApiListing 的类,可能称为ApiResourceListing。这就是您确定 Swagger 文档的入口点的地方。也许你有一个像这样指向/resources的额外类? (它也可能是 import com.wordnik.swagger.jaxrs.listing.ApiListing 的扩展,如果您没有在 REST 地址中使用格式后缀,则可以使用它。

    3) 我不知道这个。就像我一开始说的,也许可以在他们的 IRC 或他们的google group 上询问 Swagger 人。

    4) 这个答案与 Swagger 1.2 相关。如果您最近刚刚遇到这个问题,您可能想查看Swagger Jax-RS tutorial,它已针对 1.3 版进行了更新。

    【讨论】:

    • 这是正确的答案。我遇到了同样的问题,将基类从 JavaApiListing 更改为 ApiListing 解决了这个问题!
    猜你喜欢
    • 2016-12-26
    • 1970-01-01
    • 1970-01-01
    • 2015-05-06
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    • 2014-03-27
    • 2017-08-01
    相关资源
    最近更新 更多