web-dev-qa-db-ja.com

spring-bootアプリケーションからswagger-uiを起動できない

埋め込みTomcatサーバーを使用して実行しているスプリングブートアプリケーションがあります。 springfox-swaggerをアプリに統合することに部分的に成功しています。 / v2/api-docsを実行すると、webappのすべてのapiのすべてのドキュメントを見ることができます。ただし、UIから同じものにアクセスしようとすると、機能しません。詳細な結果は次のとおりです。

-localhost:8080/api/swagger-resourcesの出力

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

-localhost:8080/api/v2/api-docsの出力

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

しかし、swagger-uiにアクセスしようとすると、機能しません。以下は、swagger-uiにアクセスするために呼び出されるさまざまなURLです。

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

以下は私のSwaggerConfig.Javaクラスです

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

}

以下は私が使用しているswagger依存関係です

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

以下は、メッセージコンバーターの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;
    }
}

以下のリンクは、@ EnableWebMvcをspring-boot webappで使用すべきではなく、アノテーションを使用するとswagger-uiを起動する際に問題が発生する可能性があることを示しています。ただし、注釈を使用しない場合、Webアプリは起動しません(以下のエラースタックトレースを貼り付けました)

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

@ EnableWebMvc注釈を使用しない場合のエラートレース

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)

些細なことを見逃しているような気がします。誰かが見てください、私が行方不明になっているものを教えてください。前もって感謝します。!!

16
Naveen Chandra

何らかの方法で@EnableWebMvcアノテーションを保持する場合は、次を追加する必要があります

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

    }
19
maruf571

springfox-swagger-uiはWeb jarであり、リソースハンドラーを設定して、要求時にどのリソースをどの方法で提供するかをディスパッチサーブレットに通知する必要があります。 ../swagger-ui.htmlの場合。通常、スプリングブートアプリケーションでは auto-configuration が自動的に設定します。あなたのケースでロードされない理由は、アプリケーションがWebMvcConfigurerAdapter/@EnableWebMvcの組み合わせを介して手動で設定されることをspring-bootに通知したためです。

メインスプリング設定に@SpringBootApplicationアノテーションを配置し、WebConfigクラスをまとめて削除できるはずです。

WebConfigはJSONがインデントされていることを確認する以外に値を追加しないため、代わりにすべてを削除し、代わりに Jackson2ObjectMapperBuilder Beanに置き換えることをお勧めします。

Spring-mvc/spring-bootなどで同じことを行う方法の例については、 springfox-demosプロジェクト をご覧ください。特に SpringConfig を見て、手動でリソースハンドラーを構成する方法を確認してください。

11
Dilip Krishnan

以前にこの問題に遭遇しましたが、問題はapplication.propertiesの次の行にありました

spring.resources.add-mappings = false

削除するか、値をtrueに変更します

4
Bahgat Mashaly

静的パスパターンをオーバーライドしないと、うまくいきました。

スプリングブートアプリケーションでは、プロパティファイルから "spring.mvc.static-path-pattern"を避けるだけで、swagger-uiは正常に機能します。

1
VIrtual Host

私の場合、spring.resources.static-locationsプロパティファイルで動作します。

0
peps