wake-up-neo.com

Swagger-ui kann nicht über die Spring-Boot-Anwendung aufgerufen werden

Ich habe eine Spring-Boot-Anwendung, die mit einem eingebetteten Tomcat-Server ausgeführt wird. Es ist mir teilweise gelungen, Springfox-Swagger in die App zu integrieren. Wenn ich ein / v2/api-docs mache, kann ich alle Dokumentationen aller api in der webapp sehen. Wenn ich jedoch versuche, auf die gleiche Benutzeroberfläche zuzugreifen, funktioniert es nicht. Hier sind die detaillierten Ergebnisse.

Ausgabe von - localhost: 8080/api/swagger-resources

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

Ausgabe von - 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 das Swagger-Ui zuzugreifen, funktioniert es nicht. Nachfolgend sind die verschiedenen URLs aufgeführt, die ich für den Zugriff auf das Swagger-Ui aufgerufen habe.

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

Nachfolgend sehen Sie meine 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;
    }

}

Nachfolgend sind die Abhängigkeiten aufgeführt, die ich verwende 

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

Unten befindet sich die Nachrichtenkonverter-Datei webconfig

@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 Link unten besagt, dass @EnableWebMvc nicht in einer Spring-Boot-Webapp verwendet werden sollte. Die Verwendung der Anmerkung kann zu Problemen beim Hochladen von swagger-ui führen. Wenn ich die Annotation jedoch nicht verwende, wird die Web-App nicht angezeigt (ich habe die Fehlerstapel-Ablaufverfolgung unten eingefügt).

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

Fehlerspur, wenn ich die Annotation @EnableWebMvc nicht verwende

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 mich wissen lassen, was mir fehlt.? Danke im Voraus.!!

11
Naveen Chandra

Wenn Sie die Annotation @EnableWebMvc beibehalten möchten, müssen Sie Folgendes hinzufügen 

  @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/");

    }
15
maruf571

springfox-swagger-ui ist ein Web-Jar und erfordert, dass Sie Ressourcen-Handler einrichten, um das Dispatch-Servlet darüber zu informieren, wie und welche Ressource verwendet werden soll, wenn Sie nach ../swagger-ui.html fragen. Normalerweise kümmert sich in einer Spring-Boot-Anwendung auto-configuration um die Einrichtung für Sie. Der Grund dafür, dass es in Ihrem Fall nicht geladen wird, liegt darin, dass Sie dem Spring-Boot signalisiert haben, dass die Anwendung manuell über die Kombination WebMvcConfigurerAdapter/@EnableWebMvc konfiguriert wird. 

Sie sollten in der Lage sein, die @SpringBootApplication-Anmerkung in Ihrer Hauptfederkonfiguration zu platzieren und die WebConfig-Klasse vollständig zu entfernen. 

Da Ihre Variable WebConfig keinen anderen Wert hinzufügt, als dafür zu sorgen, dass der JSON eingerückt ist, empfehle ich, ihn alle zusammen zu entfernen und ihn stattdessen durch ein Jackson2ObjectMapperBuilder bean zu ersetzen.

Für Beispiele, wie man das Gleiche in Spring-MVC/Spring-Boot usw. macht, werfen Sie einen Blick auf das Projekt springfox-demos . Sehen Sie sich insbesondere unter SpringConfig an, wie Sie die Ressourcenhandler manuell konfigurieren.

8
Dilip Krishnan

Ich bin dieses Problem schon einmal aufgetreten und das Problem befand sich in der folgenden Zeile in application.properties

spring.resources.add-mappings = false

entfernen Sie es oder ändern Sie den Wert in true

1
Bahgat Mashaly

Es hat für mich funktioniert, wenn ich das statische Pfadmuster nicht überschreibe.

Vermeiden Sie in der Spring-Boot-Anwendung " spring.mvc.static-path-pattern " aus der Eigenschaftendatei, und swagger-ui funktioniert einwandfrei.

0
VIrtual Host

In meinem Fall habe ich spring.resources.static-locations in der Eigenschaftendatei und es funktioniert.

0
peps