2017-04-26 169 views
2

我想用我的Spring啓動應用程序配置Swagger UI。雖然v2/api-docs似乎正在加載,但http://localhost:8080/swagger-ui.html不會加載我註釋的REST API。使用Spring Boot配置Swagger UI

以下是我有:

的pom.xml:

... 
<!--Swagger UI--> 
     <dependency> 
      <groupId>io.springfox</groupId> 
      <artifactId>springfox-swagger2</artifactId> 
      <version>2.6.1</version> 
     </dependency> 
     <dependency> 
      <groupId>io.springfox</groupId> 
      <artifactId>springfox-swagger-ui</artifactId> 
      <version>2.4.0</version> 
     </dependency> 
... 

SwaggerConfig.java

import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import springfox.documentation.builders.RequestHandlerSelectors; 
import springfox.documentation.service.ApiInfo; 
import springfox.documentation.spi.DocumentationType; 
import springfox.documentation.spring.web.plugins.Docket; 
import springfox.documentation.swagger2.annotations.EnableSwagger2; 

import static springfox.documentation.builders.PathSelectors.regex; 

@Configuration 
@EnableSwagger2 
public class SwaggerConfig 
{ 
    @Bean 
    public Docket api() 
    { 
     return new Docket(DocumentationType.SWAGGER_2) 
       .select() 
       .apis(RequestHandlerSelectors.any()) 
       .paths(regex("/.*")) 
       .build().apiInfo(apiInfo()); 
    } 

    private ApiInfo apiInfo() 
    { 
     ApiInfo apiInfo = new ApiInfo(
       "My Project's REST API", 
       "This is a description of your API.", 
       "version-1", 
       "API TOS", 
       "[email protected]", 
       "API License", 
       "API License URL" 
     ); 
     return apiInfo; 
    } 
} 

http://localhost:8080/v2/api-docs

{"swagger":"2.0","info":{"description":"This is a description of your API.","version":"version-1","title":"My Project's REST API","termsOfService":"API TOS","contact":{"name":"[email protected]"},"license":{"name":"API License","url":"API License URL"}},"host":"localhost:8080","basePath":"/","tags":[{"name":"test-controller","description":"Test Controller"},{"name":"custom-field-controller","description":"Custom Field Controller"},{"name":"user-controller","description":"User Controller"},{"name":"users-controller","description":"Users Controller"},{"name":"crudapi-controller","description":"CRUDAPI Controller"},{"name":"basic-error-controller","description":"Basic Error Controller"}],"paths":{"/":{"get":{"tags":["crudapi-controller"],"summary":"greeting","operationId":"greetingUsingGET","consumes":["application/json"],"produces":["*/*"],"responses":{"200":{"description":"OK","schema":{"type":"string"}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found"}}}},"/api/javainuse":{"get":{"tags":["test-controller"],"summary":"firstPage","operationId":"firstPageUsingGET","consumes":["application/json"],"produces":["*/*"],"responses":{"200":{"description":"OK","schema":{"type":"string"}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found"}}}},"/error":{"get":{"tags":["basic-error-controller"],"summary":"errorHtml","operationId":"errorHtmlUsingGET","consumes":["application/json"],"produces":["text/html"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/ModelAndView"}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found"}}},"head":{"tags":["basic-error-controller"],"summary":"errorHtml","operationId":"errorHtmlUsingHEAD","consumes":["application/json"],"produces":["text/html"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/ModelAndView"}},"401":{"description":"Unauthorized"},"204":{"description":"No Content"},"403":{"description":"Forbidden"}}},"post":{"tags":["basic-error-controller"],"summary":"errorHtml","operationId":"errorHtmlUsingPOST","consumes":["application/json"],"produces":["text/html"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/ModelAndView"}},"201":{"description":"Created"},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found"}}},"put":{"tags":["basic-error-controller"],"summary":"errorHtml","operationId":"errorHtmlUsingPUT","consumes":["application/json"],"produces":["text/html"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/ModelAndView"}},"201":{"description":"Created"},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found"}}},"delete":{"tags":["basic-error-controller"],"summary":"errorHtml","operationId":"errorHtmlUsingDELETE","consumes":["application/json"],"produces":["text/html"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/ModelAndView"}},"401":{"description":"Unauthorized"},"204":{"description":"No Content"},"403":{"description":"Forbidden"}}},"options":{"tags":["basic-error-controller"],"summary":"errorHtml","operationId":"errorHtmlUsingOPTIONS","consumes":["application/json"],"produces":["text/html"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/ModelAndView"}},"401":{"description":"Unauthorized"},"204":{"description":"No Content"},"403":{"description":"Forbidden"}}},"patch":{"tags":["basic-error-controller"],"summary":"errorHtml","operationId":"errorHtmlUsingPATCH","consumes":["application/json"],"produces":["text/html"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/ModelAndView"}},"401":{"description":"Unauthorized"},"204":{"description":"No Content"},"403":{"description":"Forbidden"}}}},"/fields":{"get":{"tags":["custom-field-controller"],"summary":"greeting","operationId":"greetingUsingGET_1","consumes":["application/json"],"produces":["*/*"],"responses":{"200":{"description":"OK","schema":{"type":"string"}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found"}}}},"/fields/{id}":{"get":{"tags":["custom-field-controller"],"summary":"fieldAPIController","operationId":"fieldAPIControllerUsingGET","consumes":["application/json"],"produces":["*/*"],"parameters":[{"name":"id","in":"path","description":"id","required":true,"type":"integer","format":"int32"}],"responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/CustomField"}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found"}}}},"/users":{"get":{"tags":["user-controller"],"summary":"greeting","operationId":"greetingUsingGET_2","consumes":["application/json"],"produces":["*/*"],"responses":{"200":{"description":"OK","schema":{"type":"string"}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found"}}}},"https://stackoverflow.com/users/":{"get":{"tags":["users-controller"],"summary":"listUsers","operationId":"listUsersUsingGET","consumes":["application/json"],"produces":["*/*"],"responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/UserJPA"}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found"}}},"head":{"tags":["users-controller"],"summary":"listUsers","operationId":"listUsersUsingHEAD","consumes":["application/json"],"produces":["*/*"],"responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/UserJPA"}}},"401":{"description":"Unauthorized"},"204":{"description":"No Content"},"403":{"description":"Forbidden"}}},"post":{"tags":["users-controller"],"summary":"listUsers","operationId":"listUsersUsingPOST","consumes":["application/json"],"produces":["*/*"],"responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/UserJPA"}}},"201":{"description":"Created"},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found"}}},"put":{"tags":["users-controller"],"summary":"listUsers","operationId":"listUsersUsingPUT","consumes":["application/json"],"produces":["*/*"],"responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/UserJPA"}}},"201":{"description":"Created"},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found"}}},"delete":{"tags":["users-controller"],"summary":"listUsers","operationId":"listUsersUsingDELETE","consumes":["application/json"],"produces":["*/*"],"responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/UserJPA"}}},"401":{"description":"Unauthorized"},"204":{"description":"No Content"},"403":{"description":"Forbidden"}}},"options":{"tags":["users-controller"],"summary":"listUsers","operationId":"listUsersUsingOPTIONS","consumes":["application/json"],"produces":["*/*"],"responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/UserJPA"}}},"401":{"description":"Unauthorized"},"204":{"description":"No Content"},"403":{"description":"Forbidden"}}},"patch":{"tags":["users-controller"],"summary":"listUsers","operationId":"listUsersUsingPATCH","consumes":["application/json"],"produces":["*/*"],"responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/UserJPA"}}},"401":{"description":"Unauthorized"},"204":{"description":"No Content"},"403":{"description":"Forbidden"}}}},"https://stackoverflow.com/users/{id}":{"get":{"tags":["user-controller"],"summary":"userAPIController","operationId":"userAPIControllerUsingGET","consumes":["application/json"],"produces":["*/*"],"parameters":[{"name":"id","in":"path","description":"id","required":true,"type":"integer","format":"int32"}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/Collection«UserJPA»"}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found"}}}}},"definitions":{"UserJPA":{"type":"object"},"Collection«UserJPA»":{"type":"object"},"ModelAndView":{"type":"object","properties":{"empty":{"type":"boolean"},"model":{"type":"object"},"modelMap":{"type":"object","additionalProperties":{"type":"object"}},"reference":{"type":"boolean"},"status":{"type":"string","enum":["100","101","102","103","200","201","202","203","204","205","206","207","208","226","300","301","302","303","304","305","307","308","400","401","402","403","404","405","406","407","408","409","410","411","412","413","414","415","416","417","418","419","420","421","422","423","424","426","428","429","431","451","500","501","502","503","504","505","506","507","508","509","510","511"]},"view":{"$ref":"#/definitions/View"},"viewName":{"type":"string"}}},"CustomField":{"type":"object","properties":{"name":{"type":"string"}}},"View":{"type":"object","properties":{"contentType":{"type":"string"}}}}} 

招搖,ui.html(http://localhost:8080/swagger-ui.html)不顯示預期的REST調用: enter image description here

從代碼檢查中swagger-ui.html錯誤: Failed to load resource: the server responded with a status of 404()

我搜索了一遍(嘗試過web-config mvc),但錯誤仍然存​​在。也許我缺少.iml文件中的資源引用?

+0

這是錯誤的URL配置/ ui。它讓我相信,如果重置您的瀏覽器緩存,它會消失。它應該是URL'swagger-resources/configuration/ui'。 –

回答

0

添加配置類這樣

@Configuration 
public class WebMvcConfiguration extends WebMvcConfigurationSupport { 

    @Override 
    public void addResourceHandlers(final ResourceHandlerRegistry registry) { 
    // Make Swagger meta-data available via <baseURL>/v2/api-docs/ 
    registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/"); 
    // Make Swagger UI available via <baseURL>/swagger-ui.html 
    registry.addResourceHandler("/**").addResourceLocations("classpath:/META-INF/resources/"); 
    } 
} 
3

我今天有這個問題,並匹配了我springfox-swagger2springfox-swagger-ui依賴的版本修復它:

<dependency> 
     <groupId>io.springfox</groupId> 
     <artifactId>springfox-swagger2</artifactId> 
     <version>2.6.1</version> 
    </dependency> 
    <dependency> 
     <groupId>io.springfox</groupId> 
     <artifactId>springfox-swagger-ui</artifactId> 
     <version>2.6.1</version> 
    </dependency> 

有很少的其他代碼只需啓動並運行即可。一個簡單的配置類:

@Configuration 
@EnableSwagger2 
class SwaggerConfiguration { 

    @Bean 
    public Docket api() { 
     return new Docket(DocumentationType.SWAGGER_2) 
       .select() 
       .apis(RequestHandlerSelectors.basePackage("com.foo.samples.swaggersample")) 
       .paths(PathSelectors.any()) 
       .build(); 
    } 

} 

而且我application.properties

# location of the swagger json 
springfox.documentation.swagger.v2.path=/swagger.json 
+0

沒有解決問題。也許你改變了別的東西?你能否提供你的swagger-ui代碼? –

+0

謝謝,這有很多幫助。另外,我在Spring配置文件中添加了'@ Import' SwaggerConfig類,並將'/ v2/api-docs','/ configuration/ui','/ swagger-resources','/ configuration/security',/ swagger -ui.html'和'/ swagger.json'通過WebSecurity配置。 –

0

聲明:生成揚鞭UI所有的REST API,通過彈簧引導應用程序列表。

按照下面的步驟,通過彈簧啓動應用程序以產生所述Swagger UI

在pom.xml中

1.添加以下依賴 -

<dependency> 
     <groupId>io.springfox</groupId> 
     <artifactId>springfox-swagger2</artifactId> 
     <version>2.6.1</version> 
    </dependency> 

    <dependency> 
     <groupId>io.springfox</groupId> 
     <artifactId>springfox-swagger-ui</artifactId> 
     <version>2.6.1</version> 
    </dependency> 

2.添加以下代碼段在你的主應用程序類中有@ EnableSwagger2註解。

@EnableSwagger2 
    @SpringBootApplication 
    public class MyApp { 
    public static void main(String[] args) { 
     SpringApplication.run(MyApp.class, args); 
    } 

    @Bean 
    public Docket api() { 
     return new Docket(DocumentationType.SWAGGER_2).select() 
      .apis(RequestHandlerSelectors.withClassAnnotation(Api.class)) 
      .paths(PathSelectors.any()).build().pathMapping("/") 
      .apiInfo(apiInfo()).useDefaultResponseMessages(false); 
    } 

    @Bean 
    public ApiInfo apiInfo() { 
     final ApiInfoBuilder builder = new ApiInfoBuilder(); 
     builder.title("My Application API through Swagger UI").version("1.0").license("(C) Copyright Test") 
     .description("List of all the APIs of My Application App through Swagger UI"); 
     return builder.build(); 
     } 
    } 

添加以下RootController類代碼重定向到揚鞭UI頁面。通過這種方式,您不需要將Swagger-UI的dist文件夾放在資源目錄中。

import org.springframework.stereotype.Controller; 
    import org.springframework.web.bind.annotation.RequestMapping; 
    import org.springframework.web.bind.annotation.RequestMethod; 
    @Controller 
    @RequestMapping("/") 
    public class RootController { 
     @RequestMapping(method = RequestMethod.GET) 
     public String swaggerUi() { 
      return "redirect:/swagger-ui.html"; 
     } 
    } 

4.作爲最後一道工序,添加@Api和@ApiOperation符號在所有RESTControllers像下面 -

import static org.springframework.web.bind.annotation.RequestMethod.GET; 
    import org.springframework.http.HttpStatus; 
    import org.springframework.web.bind.annotation.RequestMapping; 
    import org.springframework.web.bind.annotation.RequestMethod; 
    import org.springframework.web.bind.annotation.ResponseStatus; 
    import org.springframework.web.bind.annotation.RestController; 
    import io.swagger.annotations.Api; 
    import io.swagger.annotations.ApiOperation; 

    @RestController 
    @RequestMapping("/hello") 
    @Api(value = "hello", description = "Sample hello world application") 
    public class TestController { 

     @ApiOperation(value = "Just to test the sample test api of My App Service") 
     @RequestMapping(method = RequestMethod.GET, value = "/test") 
     // @Produces(MediaType.APPLICATION_JSON) 
     public String test() { 
      return "Hello to check Swagger UI"; 
     } 

     @ResponseStatus(HttpStatus.OK) 
     @RequestMapping(value = "/test1", method = GET) 
     @ApiOperation(value = "My App Service get test1 API", position = 1) 
     public String test1() { 
      System.out.println("Testing"); 
      if (true) { 
       return "Tanuj"; 
      } 
      return "Gupta"; 
     } 
    } 

現在你就完成了。現在運行您的Spring Boot應用程序,轉到瀏覽器並輸入localhost:8080。您將看到Swagger UI包含您的REST API的所有細節。

快樂編碼。
如果您想檢查它,上述實現的源代碼也在我的blog上。在appliation配置招搖

0

最好的辦法是通過在pom.xml中

先加入

<dependency> 
     <groupId>io.springfox</groupId> 
     <artifactId>springfox-swagger2</artifactId> 
     <version>2.6.1</version> 
    </dependency> 
    <dependency> 
     <groupId>io.springfox</groupId> 
     <artifactId>springfox-swagger-ui</artifactId> 
     <version>2.6.1</version> 
    </dependency> 

,然後在下面添加插件

<plugin> 
       <groupId>com.github.kongchen</groupId> 
       <artifactId>swagger-maven-plugin</artifactId> 
       <version>3.1.5</version> 
       <configuration> 
        <apiSources> 
         <apiSource> 
          <springmvc>true</springmvc> 
          <locations>com.sandy2friends.test.web.rest</locations> 
          <info> 
           <title>REST API</title> 
           <version>1</version> 
           <description>REST API</description> 
          </info> 
          <swaggerDirectory>swagger</swaggerDirectory> 
          <swaggerFileName>rest api</swaggerFileName> 
         </apiSource> 
        </apiSources> 
       </configuration> 
       <executions> 
        <execution> 
         <phase>compile</phase> 
         <goals> 
          <goal>generate</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 

click here to know more on the plugin

這個插件配置會自動創建swagger json文件並且會在您的應用程序中配置swagger ui。

+0

抱歉不明白。已經是答案了 –

相關問題