繁体   English   中英

REST API - Swagger + Java + Jersey错误的列表路径和额外的apis

[英]REST API - Swagger + Java + Jersey wrong listing path and additional apis

在我的项目中,我使用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的beginnig中删除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是空的。 我可以删除它吗?

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

我会尝试回答你所有的三个问题,尽管我不是一个Swagger专家。 我也建议在IRC上与Swagger开发人员交谈 - 他们很快就会做出回应。 我认为让Swagger“自动”工作是值得的,这样你就不必手动更新它 - 这对我来说似乎不太理想。

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

2)你有一个扩展com.wordnik.swagger.jaxrs.JavaApiListing的类,可能叫做ApiResourceListing 这就是您确定Swagger文档的入口点的位置。 也许你有一个像这个指向/资源的额外课程? (它也可能是导入com.wordnik.swagger.jaxrs.listing.ApiListing的扩展,如果您没有在REST地址中使用格式后缀,则可以使用它。

3)我不知道这个。 就像我在开始时所说的那样,也许会问他们的IRC或他们的谷歌小组的Swagger人。

4)这个答案与Swagger 1.2相关。 如果您刚刚遇到这个问题,您可能需要查看Swagger Jax-RS教程 ,该教程已针对1.3版进行了更新。

我用这种方式解决了这个问题:

  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 you /swagger-ui目录的index.html的discoveryUrl路径

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

我的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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM