簡體   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