2015-09-08 2 views
7

Ich habe ein Spring Boot-Projekt mit Prallbox über Springbox integrieren möchten.Spring Boot + Springbox Swagger Fehler

Ich habe meine Spring Boot App und läuft alles gut.

Jedoch, nachdem ich springbox hinzugefügt habe, kann es Unit-Test nicht bestehen.

Hier sind die Details, die ich im Projekt hinzugefügt habe.

Für pom.xml, hinzugefügt

<!--Swagger io for API doc--> 
    <dependency> 
     <groupId>io.swagger</groupId> 
     <artifactId>swagger-core</artifactId> 
     <version>1.5.3</version> 
    </dependency> 
    <dependency> 
     <groupId>io.springfox</groupId> 
     <artifactId>springfox-swagger2</artifactId> 
     <version>2.2.2</version> 
    </dependency> 
    <dependency> 
     <groupId>io.springfox</groupId> 
     <artifactId>springfox-swagger-ui</artifactId> 
     <version>2.2.2</version> 
    </dependency> 

dann mit einer Prahlerei Config-Klasse

@Configuration 
@EnableSwagger2 
public class SwaggerConfig { 

@Bean 
public Docket booksApi() { 
    return new Docket(DocumentationType.SWAGGER_2) 
      .apiInfo(apiInfo()) 
      .select() 
      .apis(RequestHandlerSelectors.any()) 
      .paths(PathSelectors.regex("/.*")) 
      .build(); 
} 

private ApiInfo apiInfo() { 
    return new ApiInfoBuilder() 
      .title("blah") 
      .description("blah.") 
      .termsOfServiceUrl("http://www.blah.com.au") 
      .contact("blah") 
      .build(); 
} 

} 

Der Fehler, den ich immer bin, wenn mvn clean package laufen ist

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'webMvcRequestHandlerProvider' defined in URL [jar:file:/Users/jasonfeng/.m2/repository/io/springfox/springfox-spring-web/2.2.2/springfox-spring-web-2.2.2.jar!/springfox/documentation/spring/web/plugins/WebMvcRequestHandlerProvider.class]: Unsatisfied dependency expressed through constructor argument with index 0 of type [java.util.List]: : No qualifying bean of type [org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping] found for dependency [collection of org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping] found for dependency [collection of org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {} 

die Version ich verwende ist

<parent> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-parent</artifactId> 
    <version>1.2.5.RELEASE</version> 
</parent> 

Antwort

13

In dieses Problem für die Weile Morgen ohne Glück untersucht, dann diese Frage gestellt. Gleich nachdem ich die Frage gestellt hatte, fand ich die Lösung dafür heraus ..... (Ich beschuldige den nicht so guten Morgenkaffee)

Entfernen Sie einfach die @Configuration Annotation in der Swagger Konfigurationsklasse. Hier

ist der Link Ich beziehe mich auf

https://github.com/springfox/springfox/issues/462

+1

danke für die Freigabe der Folge – fehguy

+0

können Sie dies erreichen mit der Antwort von @Nish –

+0

Wenn ich die Configuration Annotation entfernt, dann habe ich pop-up: "Kann nicht Basis-URL abzuleiten. Dies ist üblich, wenn dynamische Servlet verwenden Registrierung oder wenn die API hinter einem API-Gateway ist. Die Basis-URL ist die Wurzel von wo alle Swagger-Ressourcen bedient werden ". Die Lösung unten mit Profilen funktioniert. – Maksim

4

Ich war genau das gleiche Problem gegenüber. Hier ist die Lösung.

Fügen Sie diese auf application-test.properties (Create eine, wenn nicht bereits vorhanden)

spring.profiles.active=test 

den Test Anmerken (falls nicht bereits vorhanden)

@TestPropertySource(locations = "classpath:application-test.properties") 

Erstellen Sie eine neue Swagger Configuration-Klasse und kommentieren Sie es wie folgt:

@Configuration 
@EnableSwagger2 
@Profile("!test") 
public class SwaggerConfig { 
    @Bean 
    public Docket api() { 
     ......... 
    } 
} 

Dies wird sicherstellen, dass swagger config wird für den Test überhaupt nicht geladen.

+0

Was bedeutet @TestPropertySource? – fiddle

+0

Es wird verwendet, um anwendungskontextgeladene Eigenschaften für Tests zu überschreiben. Sie können sich die Frühjahrsdokumentation ansehen, um sie weiter zu verstehen. – Nish

+0

tolle Sachen genau das, was ich suchte. –