2017-04-26 6 views
2

Ich versuche Swagger UI mit meiner Spring Boot-Anwendung zu konfigurieren. Obwohl die v2/api-docs ordnungsgemäß geladen scheint, lädt die http://localhost:8080/swagger-ui.html meine annotierte REST-API nicht. HierSwagger UI mit Spring Boot konfigurieren

ist, was ich habe:

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"}}}}} 

Die Prahlerei-ui.html (http://localhost:8080/swagger-ui.html) zeigt nicht die erwartete REST ruft: enter image description here

Der Fehler in swagger-ui.html von der Code-Inspektion: Failed to load resource: the server responded with a status of 404().

Ich habe gegoogled (versuchte Web-Config mvc auch), aber der Fehler bleibt bestehen. Vielleicht fehlt mir ein Ressourcenverweis in der .iml-Datei?

+0

Das ist die falsche URL 'configuration/ui'. Es führt mich zu glauben, dass es weggehen wird, wenn Sie Ihren Browser-Cache zurücksetzen. Es sollte die URL 'swagger-resources/configuration/ui' sein. –

Antwort

0

eine Config-Klasse hinzufügen, ähnlich

@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

ich heute dieses Problem hatte und es behebt, indem die Versionen meiner springfox-swagger2 und springfox-swagger-ui Abhängigkeiten passend bis:

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

Es gibt sehr wenig anderen Code mach es einfach auf und los. Eine einfache Konfigurationsklasse:

@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(); 
    } 

} 

Und mein application.properties

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

Das Problem wurde nicht behoben. Vielleicht hast du auch etwas anderes verändert? Könnten Sie bitte Ihren swagger-ui-Code angeben? –

+0

Danke, das hat sehr geholfen. Zusätzlich habe ich die @ SwaggerConfig-Klasse zur Spring-Konfiguration hinzugefügt, und auf die weiße Liste '/ v2/api-docs','/configuration/ui', '/ swagger-resources','/configuration/security', '/ swagger -ui.html und// swagger.json durch die WebSecurity-Konfiguration. –

0

Statement: Generieren Swagger UI für die Auflistung aller REST-APIs durch Frühlings-Boot-Anwendung.

Sie die folgenden Schritte Folgen Sie der Swagger UI durch Feder Boot-Anwendung zu generieren:

1. Add folgende Abhängigkeit in 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> 

2. Fügen Sie den folgenden Code in Ihrer Hauptanwendungsklasse mit der @ EnableSwagger2-Annotation.

@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(); 
     } 
    } 

3. die unter RootController Klasse in Ihrem Code hinzufügen zu dem Swagger UI Seite zu umleiten. Auf diese Weise müssen Sie den Ordner dist von Swagger-UI nicht in Ihr Ressourcenverzeichnis einfügen.

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. die letzten Schritte zu sein, fügen Sie die @Api und @ApiOperation Notation in allen RESTControllers wie unten -

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"; 
     } 
    } 

Jetzt sind fertig. Um nun Ihre Spring Boot-Anwendung auszuführen, gehen Sie in den Browser und geben Sie localhost:8080 ein. Sie sehen Swagger UI mit allen Details Ihrer REST-APIs.

Glückliche Kodierung.
Der Quellcode der obigen Implementierung ist auch auf meinem blog, wenn Sie es wie Check-out fühlen.

0

Der beste Weg, Prahlerei in Ihrem appliation ist dies, indem zuerst

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

in pom.xml

und fügen Sie dann Plugin unter Plugin

<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

konfigurieren Konfiguration erstellt automatisch Swagger JSON-Datei und wird Konfigurieren Sie Swagger in Ihrer Anwendung.

+0

Sorry, habe es nicht verstanden. schon eine antwort bedeutet –

Verwandte Themen