2015-08-25 17 views
10

Ich habe eine Spring-Boot-Anwendung, die ich mit eingebetteten Tomcat-Server ausgeführt werde. Ich bin teilweise erfolgreich darin, Springfox-Swagger in die App zu integrieren. Wenn ich eine /v2/api-docs mache, kann ich die gesamte Dokumentation aller APIs in der Webapp sehen. Wenn ich versuche, über die Benutzeroberfläche auf dasselbe zuzugreifen, funktioniert es jedoch nicht. Unten sind die detaillierten Ergebnisse.Nicht möglich, Swagger-Ui von Spring-Boot-Anwendung zu starten

Ausgabe - localhost: 8080/api/Prahlerei-Ressourcen

[ { 
    "name" : "default", 
    "location" : "/v2/api-docs", 
    "swaggerVersion" : "2.0" 
} ] 

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

I get valid results. I can confirm that and the output is too large to paste here 

Aber wenn Ich versuche auf den Swagger-Ui zuzugreifen, es funktioniert nicht. Im Folgenden sind die verschiedenen URLs aufgeführt, die ich aufgerufen habe, um auf das swagger-ui zuzugreifen.

http://localhost:8080/swagger-ui.html - UI is loading, but no documentation of API's is present 
http://localhost:8080/api/swagger-ui.html - 404 Not Found 
http://localhost:8080/springfox - 404 Not Found 
http://localhost:8080/api/springfox - 404 Not Found 

Unten ist mein SwaggerConfig.java Klasse

package com.vmware.vrack.lcm; 

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.swagger.web.UiConfiguration; 
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; 
    } 

} 

Unterhalb der Prahlerei Abhängigkeiten i

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

Im Folgenden verwende die Nachrichtenumformer webconfig Datei

@Configuration 
@EnableWebMvc 
public class WebConfig extends WebMvcConfigurerAdapter { 

    @Override 
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { 
     converters.add(jackson2Converter()); 
    } 

    @Bean 
    public MappingJackson2HttpMessageConverter jackson2Converter() { 
     MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); 
     converter.setObjectMapper(objectMapper()); 
     return converter; 
    } 

    @Bean 
    public ObjectMapper objectMapper() { 
     ObjectMapper objectMapper = new ObjectMapper(); 
     objectMapper.enable(SerializationFeature.INDENT_OUTPUT); 
     return objectMapper; 
    } 
} 

Der folgende Link sa ys, dass @EnableWebMvc sollte nicht in einer Spring-Boot-Webanwendung verwendet werden und die Verwendung der Annotation könnte Probleme bei der Erhebung von Swagger-Ui verursachen. Aber, wenn ich nicht die Anmerkung verwenden, die Web-App ist nicht kommen (ich habe den Fehler-Stack-Trace eingefügt)

http://springfox.github.io/springfox/docs/current/#configuring-the-objectmapper

Fehler Spur, wenn ich nicht verwenden die @EnableWebMvc Anmerkung

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'documentationPluginsBootstrapper' defined in URL [jar:file:/Users/ngorijala/.m2/repository/io/springfox/springfox-spring-web/2.2.2/springfox-spring-web-2.2.2.jar!/springfox/documentation/spring/web/plugins/DocumentationPluginsBootstrapper.class]: Unsatisfied dependency expressed through constructor argument with index 1 of type [springfox.documentation.spi.service.RequestHandlerProvider]: : Error creating bean with name 'webMvcRequestHandlerProvider' defined in URL [jar:file:/Users/ngorijala/.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: {}; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'webMvcRequestHandlerProvider' defined in URL [jar:file:/Users/ngorijala/.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: {} 
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:749) 
    at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:185) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1139) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1042) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:504) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:755) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480) 
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403) 
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306) 
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106) 
    at org.eclipse.jetty.server.handler.ContextHandler.callContextInitialized(ContextHandler.java:799) 
    at org.eclipse.jetty.servlet.ServletContextHandler.callContextInitialized(ServletContextHandler.java:499) 
    at org.eclipse.jetty.server.handler.ContextHandler.startContext(ContextHandler.java:790) 
    at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:337) 
    at org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1343) 
    at org.eclipse.jetty.maven.plugin.JettyWebAppContext.startWebapp(JettyWebAppContext.java:296) 
    at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1336) 
    at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:742) 
    at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:499) 
    at org.eclipse.jetty.maven.plugin.JettyWebAppContext.doStart(JettyWebAppContext.java:365) 
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) 
    at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:132) 
    at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:114) 
    at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:61) 
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.doStart(ContextHandlerCollection.java:163) 

Ich habe das Gefühl, dass mir etwas Triviales fehlt. Kann jemand bitte einen Blick darauf werfen und mir mitteilen was ich vermisse. Danke im Voraus.!!

Antwort

5

springfox-Prahlerei-ui ist ein Web-Glas und erfordert, dass Sie Ressource-Handler einrichten, um den Versand Servlet zu informieren, wie und welche Ressource bis zu dienen, wenn Sie für ../swagger-ui.html fragen. Normalerweise in einer Spring-Boot-Anwendung auto-configuration kümmert sich um die Einrichtung für Sie. Der Grund dafür, dass es in Ihrem Fall nicht geladen wird, ist, dass Sie beim Starten signalisierten, dass die Anwendung manuell über die Kombination WebMvcConfigurerAdapter/@EnableWebMvc konfiguriert wird.

Sie sollten in der Lage sein, die @SpringBootApplication Annotation auf Ihre Hauptfederkonfiguration zu setzen und die Klasse WebConfig All-together loszuwerden.

Da Ihr WebConfig keinen Wert hinzufügt, außer dass Sie sicherstellen, dass der JSON eingerückt ist, würde ich vorschlagen, es alle zusammen zu entfernen und stattdessen durch eine Jackson2ObjectMapperBuilder Bean zu ersetzen.

Für Beispiele, wie man das Gleiche im Frühling-Mvc/Spring-Boot etc. tut, werfen Sie einen Blick auf die . Sehen Sie sich insbesondere SpringConfig an, um zu erfahren, wie Sie die Ressourcenhandler manuell konfigurieren.

+0

Das ist für mich gearbeitet hinzuzufügen. Prost – Yonkee

9

Wenn Sie @EnableWebMvc Anmerkung irgendeine Art und Weise halten wollen, müssen Sie die folgende

@Override 
    public void addResourceHandlers(ResourceHandlerRegistry registry) { 

      registry.addResourceHandler("swagger-ui.html") 
        .addResourceLocations("classpath:/META-INF/resources/"); 

      registry.addResourceHandler("/webjars/**") 
        .addResourceLocations("classpath:/META-INF/resources/webjars/"); 

    } 
+0

+1 für die Lösung meines Problems. Vielen Dank. Beachten Sie auch, dass diese Methode innerhalb der Klasse verwendet wird, die WebMvcConfigurerAdapter erweitert. – idungotnosn