【问题标题】:swagger-ui No mapping found for HTTP requestswagger-ui 找不到 HTTP 请求的映射
【发布时间】:2017-09-18 14:57:42
【问题描述】:

我正在尝试将现有的 Rest API 记录为 Spring MVC 项目(不是 Spring Boot!)。

我的应用程序名为 api,因此 http://localhost:9090/api 将是根端点。因为我使用的是 spring-data-rest,所以在那个 URL 上我可以看到我所有暴露的存储库的 json。到目前为止一切顺利。

我也可以访问 swagger JSON http://localhost:9090/api/v2/api-docs

问题

我无法访问 http://localhost:9090/api/swagger-ui.html 上的 swagger-UI 组件。它给了我

WARN  org.springframework.web.servlet.PageNotFound- No mapping found for HTTP request with URI [/api/swagger-ui.html] in DispatcherServlet with name 'dispatcher'

启动tomcat时检查spring日志我可以看到一些奇怪的东西

DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory- Finished creating instance of bean 'swaggerApiListingReader'
DEBUG org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping- Rejected bean name 'swaggerConfig': no URL paths identified
DEBUG org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping- Rejected bean name 'swagger2Controller': no URL paths identified
DEBUG org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping- Rejected bean name 'swaggerMediaTypeReader': no URL paths identified
DEBUG org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping- Rejected bean name 'swaggerOperationModelsProvider': no URL paths identified
DEBUG org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping- Rejected bean name 'swaggerOperationResponseClassReader': no URL paths identified
DEBUG org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping- Rejected bean name 'swaggerOperationTagsReader': no URL paths identified
DEBUG org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping- Rejected bean name 'swaggerResponseMessageReader': no URL paths identified
DEBUG org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping- Rejected bean name 'swaggerParameterDescriptionReader': no URL paths identified
DEBUG org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping- Rejected bean name 'swaggerExpandedParameterBuilder': no URL paths identified
DEBUG org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping- Rejected bean name 'swaggerApiListingReader': no URL paths identified
DEBUG org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping- Rejected bean name 'swaggerProperties': no URL paths identified
DEBUG org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping- Rejected bean name 'springfox.documentation.swagger.configuration.SwaggerCommonConfiguration': no URL paths identified
DEBUG org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping- Rejected bean name 'springfox.documentation.swagger2.configuration.Swagger2DocumentationConfiguration': no URL paths identified
DEBUG org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping- Rejected bean name 'swagger2Module': no URL paths identified

这似乎表明由于某种原因 swaggerController 未与任何 URL 关联,因此出现 404 错误。

这些是我正在使用的版本

  <spring.version>4.2.8.RELEASE</spring.version>
  <spring-data.version>Gosling-SR4</spring-data.version>
  <spring-data-rest>2.4.6.RELEASE</spring-data-rest> 
   <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>
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-data-rest</artifactId>
        <version>2.6.1</version>
    </dependency>

这是我的 Java 配置文件。值得指出的是方法 addResourceHandlers 永远不会执行

    @Configuration
    @EnableSwagger2
    @EnableWebMvc

  @Import({springfox.documentation.spring.data.rest.configuration.SpringDataRestConfiguration.class})
public class SwaggerConfig extends WebMvcConfigurerAdapter {
    @Bean
    public Docket api() {
        return new Docket(DocumentationType.SWAGGER_2)
                .select()
                .apis(RequestHandlerSelectors.any())
                .paths(PathSelectors.any())
                .build();
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {

        System.out.println("******************************Configuring swagger resource handler");
        registry.addResourceHandler("swagger-ui.html")
                .addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/");
    }
}

有什么建议吗?总之,swagger-ui 是不行的。

【问题讨论】:

    标签: java spring spring-mvc swagger-ui springfox


    【解决方案1】:

    此解决方案由 this answer @oksett 提供

    创建一个配置类,扩展WebMvcConfigurerAdapter并覆盖以下方法:

    如果使用 Spring 5,而不是扩展 WebMvcConfigurerAdapter 实现 WebMvcConfigurer

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addRedirectViewController("/api/v2/api-docs", "/v2/api-docs");
        registry.addRedirectViewController("/api/swagger-resources/configuration/ui", "/swagger-resources/configuration/ui");
        registry.addRedirectViewController("/api/swagger-resources/configuration/security", "/swagger-resources/configuration/security");
        registry.addRedirectViewController("/api/swagger-resources", "/swagger-resources");
    }
    
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/api/swagger-ui.html**").addResourceLocations("classpath:/META-INF/resources/swagger-ui.html");
        registry.addResourceHandler("/api/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
    }
    

    在您的情况下,您需要将addViewControllers 添加和实施到SwaggerConfig。还要注意 addResourceHandlers 方法中将 /api 添加到救援处理程序位置的更改。

    您现在应该可以访问我的 swagger-ui.html @ http://localhost:9090/api/swagger-ui.html

    【讨论】:

    • 谢谢。虽然没有运气。我仍然可以在 Spring 日志中看到 BeanNameUrlHandlerMapping- Rejected bean ...: no URL paths identify all swaggerBeans (swaggerConfig, swagger2Controller, swaggerMediaTypeReader, etc).此外,您从中获取解决方案的链接是 spring boot 。还有其他想法吗?
    • 我需要确保的第一件事是加载时配置实际执行。 addViewControllersaddResourceHandlers 都从未执行过,我认为这是根本原因....
    • 它是一个spring mvc的解决方案,boot是一个超集。其次,关于被拒绝的 bean,消息,它是一个调试消息,所以它可能是你正在追逐的红鲱鱼。如果它很重要,您将不会在 /v2/apidocs 端点中看到任何内容,因为被拒绝的 bean 之一是 swagger2Controller。要尝试的另一件事是删除@EnableWebMvc。
    • 让你重新启动,是的,它是调试,所以它应该没关系。 Spring 中触发 addViewControllers 和 * addResourceHandlers* 的配置是什么?我的例子和你的建议都没有发生这种情况。
    • @filipe 这回答了你的问题吗?
    【解决方案2】:

    以下是关于如何使用 swagger doc 和工作 UI 配置 Spring Boot 的完整代码。

    pom.xml

    <!-- Spring boot version is 2.0.3.RELEASE-->
    
    <dependencies>
      <!-- Swagger 2 Doc Dependency -->
      <dependency>
          <groupId>io.springfox</groupId>
          <artifactId>springfox-swagger2</artifactId>
          <version>2.9.2</version>
      </dependency>
    
      <!-- Swagger 2 UI -->
      <dependency>
          <groupId>io.springfox</groupId>
          <artifactId>springfox-swagger-ui</artifactId>
          <version>2.9.2</version>
      </dependency>
    </dependencies>
    

    SwaggerDocConfig.java

    package com.example.springbootswagger.config;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Import;
    import org.springframework.context.annotation.PropertySource;
    import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration;
    import springfox.documentation.builders.ApiInfoBuilder;
    import springfox.documentation.builders.PathSelectors;
    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;
    
    @Configuration
    @EnableSwagger2
    public class SwaggerDocConfig implements WebMvcConfigurer {
    
        @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/");
        }
    
        @Bean
        public Docket apiDocket() {
    
            return new Docket(DocumentationType.SWAGGER_2)
                    .apiInfo(getApiInfo())
                    .select()
                    .apis(RequestHandlerSelectors.basePackage("com.example.springbootswagger.controller"))
                    .paths(PathSelectors.any())
                    .build();
        }
    
        private ApiInfo getApiInfo() {
    
            return new ApiInfoBuilder()
                    .title("Swagger API Doc")
                    .description("More description about the API")
                    .version("1.0.0")
                    .build();
        }
    }
    

    【讨论】:

      【解决方案3】:

      不久前遇到过类似的问题。我发现这是由我的自定义异常处理程序中的@EnableWebMvc 注释引起的。

      @ControllerAdvice
      @RestController
      @EnableWebMvc
      public class CustomizedResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {}
      

      删除 @EnableWebMvc 对我有用!!

      【讨论】:

      • 有没有不删除@EnableWebMvc 的选项?我需要此注释用于 ContentNegotiation
      【解决方案4】:

      这对我有用

      @Configuration
      public class WebMvcConfig implements WebMvcConfigurer {
          @Override
          public void addResourceHandlers(ResourceHandlerRegistry registry) {
              registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
              registry.addResourceHandler("swagger-ui.html")
                      .addResourceLocations("classpath:/META-INF/resources/");
      
              registry.addResourceHandler("/webjars/**")
                      .addResourceLocations("classpath:/META-INF/resources/webjars/");    
         }
      }
      

      【讨论】:

        【解决方案5】:

        我们最终单独部署了 Swagger-UI 客户端并通过 Nginx 提供服务。我们无法弄清楚它有什么问题,并且根据广泛的研究发现许多其他人也有同样的困难,所以我们决定停止花时间尝试嵌入式方法。

        【讨论】:

          【解决方案6】:

          遇到了类似的问题,Dilips anwser 工作。 更准确地说:

          1. 我的 api-docs 位置运行良好

          2. 我的 swagger-ui.html 正在渲染,但没有查看任何内容。在浏览器控制台中,我可以看到 /configuration/ui 目录的 404。

          正确的目录是 /swagger-resources/configuration/ui 所以我必须做一个重定向:

          registry.addRedirectViewController("/configuration/ui", "/swagger-resources/configuration/ui");
          

          【讨论】:

            【解决方案7】:

            我解决了这个实现的问题:

            import org.springframework.context.annotation.Bean;
            import org.springframework.context.annotation.Configuration;
            import org.springframework.security.config.annotation.web.builders.HttpSecurity;
            import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
            import org.springframework.security.core.annotation.AuthenticationPrincipal;
            
            import com.google.common.base.Predicates;
            
            import springfox.documentation.builders.PathSelectors;
            import springfox.documentation.builders.RequestHandlerSelectors;
            import springfox.documentation.spi.DocumentationType;
            import springfox.documentation.spring.web.plugins.Docket;
            import springfox.documentation.swagger2.annotations.EnableSwagger2;
            
            @Configuration
            @EnableSwagger2
            public class SwaggerConfig extends WebSecurityConfigurerAdapter {
                public static String[] SWAGGER_URL_PATHS = new String[] { "/swagger-ui.html**", "/swagger-resources/**",
                        "/v2/api-docs**", "/webjars/**" };
            
                @Override
                protected void configure(HttpSecurity http) throws Exception {
                    http.csrf().disable();
                    http.requestMatchers().antMatchers(SWAGGER_URL_PATHS).and().authorizeRequests().antMatchers(SWAGGER_URL_PATHS)
                            .permitAll();
                }
            
                @Bean
                public Docket docket() {
            
                    return new Docket(DocumentationType.SWAGGER_2).ignoredParameterTypes(AuthenticationPrincipal.class).select()
                            .apis(Predicates.not(RequestHandlerSelectors.basePackage("org.springframework.boot")))
                            .paths(PathSelectors.any()).build();
                }
            
            }
            

            P.S 不要忘记在你的 gradle 文件中这样做

            compile('org.springframework.boot:spring-boot-starter-security')
            

            【讨论】:

              【解决方案8】:

              对于 Spring Boot 2.x.x 或 Spring 5,在 Swagger 类配置中实现 WebMvcConfigurer 并添加以下注解:@Component@Configuration@EnableSwagger2。 看看下面的实现:

              @Component
              @Configuration
              @EnableSwagger2
              public class SwaggerConfig implements WebMvcConfigurer {
                  @Bean
                  public Docket api(){
                      return new Docket(DocumentationType.SWAGGER_2)
                              .select()
                              .apis(RequestHandlerSelectors.any())
                              .paths(PathSelectors.any())
                              .build()
                              .apiInfo(getApiInfo());
                  }
              
                  private ApiInfo getApiInfo() {
                      return new ApiInfoBuilder()
                              .title("Custom Title")
                              .description("Custom Description")
                              .version("1.0.0")
                              .build();
                  }
              
                  @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/");
                  }
              
              }
              

              如果您使用的是 Spring 5 或 Spring Boot 2.x.x,则 Swagger 版本 2.9.2 是最兼容的

              Maven 依赖:

                      <dependency>
                          <groupId>io.springfox</groupId>
                          <artifactId>springfox-swagger2</artifactId>
                          <version>2.9.2</version>
                      </dependency>
              
                      <dependency>
                          <groupId>io.springfox</groupId>
                          <artifactId>springfox-swagger-ui</artifactId>
                          <version>2.9.2</version>
                      </dependency>
              

              查看 swagger 文档:http://localhost:8080/context-root/swagger-ui.html

              【讨论】:

                【解决方案9】:

                我正在使用 springfox 开放 API 3,这对我来说非常有效:

                pom.xml

                <dependency>
                    <groupId>org.webjars</groupId>
                    <artifactId>bootstrap</artifactId>
                    <version>4.5.0</version>
                </dependency>
                
                        <dependency>
                            <groupId>io.springfox</groupId>
                            <artifactId>springfox-swagger-ui</artifactId>
                            <version>3.0.0</version>
                        </dependency>
                
                        <dependency>
                            <groupId>io.springfox</groupId>
                            <artifactId>springfox-oas</artifactId>
                            <version>3.0.0</version>
                        </dependency>
                   
                        <dependency>
                            <groupId>io.springfox</groupId>
                            <artifactId>springfox-swagger2</artifactId>
                            <version>3.0.0</version>
                
                        </dependency>
                       
                        <dependency>
                            <groupId>io.springfox</groupId>
                            <artifactId>springfox-spring-web</artifactId>
                            <version>3.0.0</version>
                            
                        </dependency>
                        
                        <dependency>
                    <groupId>com.fasterxml.jackson.core</groupId>
                    <artifactId>jackson-databind</artifactId>
                    <version>2.12.2</version>
                </dependency>
                

                应用配置

                @Configuration
                @EnableWebMvc
                @ComponentScan("com.swagger.sample.test")
                @EnableOpenApi
                public class AppConfiguration {
                    
                    
                }
                

                ServletInitializer

                public class ServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
                  @Override
                  protected Class<?>[] getServletConfigClasses() {
                    return new Class[] { AppConfiguration.class };
                  }
                
                  @Override
                  protected String[] getServletMappings() {  
                    return new String[] { "/" };
                  }
                
                  @Override
                  protected Class<?>[] getRootConfigClasses() {
                    return null;
                  }
                
                }
                

                SpringConfig

                @Component
                public class SpringConfig implements WebMvcConfigurer {
                    
                    private static final Log LOGGER = LogFactory.getLog(ServletInitializer.class);
                
                    
                  @Override
                  public void addResourceHandlers(ResourceHandlerRegistry registry) {       
                      LOGGER.debug("[SpringConfig] addResourceHandlers");
                        System.out.println("[SpringConfig] addResourcehandlers");
                        registry. 
                addResourceHandler("/swagger-ui/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/")
                .resourceChain(false);
                  }
                
                  @Override
                  public void addViewControllers(ViewControllerRegistry registry) {
                              LOGGER.debug("[SpringConfig] addingViewControllers");
                        System.out.println("[SpringConfig] addingViewControllers");
                    registry.addViewController("/swagger-ui/")
                        .setViewName("forward:" + "/swagger-ui/index.html");
                  }
                }
                

                资源路径应该指向jar中index.html的位置 see this image

                【讨论】:

                  【解决方案10】:

                  这对我有用

                  @Configuration
                  public class WebMvcConfig extends WebMvcConfigurationSupport{ 
                  
                  @Override
                  public void addViewControllers(ViewControllerRegistry registry) {
                    registry.addRedirectViewController("/configuration/ui", "/swagger-resources/configuration/ui");
                  }
                  
                  @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/");
                  }}
                  

                  这里是 pom:

                     <dependency>
                          <groupId>io.springfox</groupId>
                          <artifactId>springfox-swagger2</artifactId>
                          <version>2.9.2</version>
                      </dependency>
                      <dependency>
                          <groupId>io.springfox</groupId>
                          <artifactId>springfox-swagger-ui</artifactId>
                          <version>2.9.2</version>
                      </dependency>
                  

                  【讨论】:

                    【解决方案11】:

                    如果您使用的是 spring boot,这就是您所需要的:

                    <parent>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-starter-parent</artifactId>
                        <version>2.1.6.RELEASE</version>
                        <relativePath />
                    </parent>
                    
                    
                    
                        <dependency>
                            <groupId>org.springframework.boot</groupId>
                            <artifactId>spring-boot-starter-web</artifactId>
                        </dependency>
                    
                        <dependency>
                            <groupId>io.springfox</groupId>
                            <artifactId>springfox-swagger2</artifactId>
                            <version>2.9.2</version>
                        </dependency>
                    
                        <dependency>
                            <groupId>io.springfox</groupId>
                            <artifactId>springfox-swagger-ui</artifactId>
                            <version>2.9.2</version>
                        </dependency>
                    

                    配置4招摇:

                    @Configuration
                    @EnableSwagger2
                    public class SwaggerConfig {
                    
                        @Bean
                        public Docket api() {
                            return new Docket(DocumentationType.SWAGGER_2).select().apis(RequestHandlerSelectors.any()).paths(PathSelectors.any()).build();
                        }
                    }
                    

                    【讨论】:

                      【解决方案12】:

                      新版本的 Swagger 于今天发布:https://github.com/springfox/springfox

                      更好更简单的配置!我正在将 Spring boot 升级到 2.3.1 并将 swagger 添加到我的微服务中,在上面许多答案中提到的所有正确配置之后,没有得到 swagger-ui.html 的映射。一旦我使用了这个新版本,一切都很好!

                      【讨论】:

                        【解决方案13】:

                        同样的事情也发生在我身上,对我来说,从 3.0.0 版本到 2.9.2 版本是可行的

                            <dependency>
                                <groupId>io.springfox</groupId>
                                <artifactId>springfox-swagger2</artifactId>
                                <version>2.9.2</version>
                            </dependency>
                            
                            <dependency>
                                <groupId>io.springfox</groupId>
                                <artifactId>springfox-swagger-ui</artifactId>
                                <version>2.9.2</version>
                            </dependency>
                        

                        【讨论】:

                          【解决方案14】:

                          经过几天的疑惑,我终于找到了可行的答案,这对于许多 maven 问题应该是正确的——你只需要删除 .m2/repository 文件夹(它会在 2 分钟内自动恢复)——然后你就可以更新或降级任何 maven 依赖项,在这种情况下它们可能是 swagger-ui 和 swagger2。

                          【讨论】:

                            猜你喜欢
                            • 1970-01-01
                            • 2021-08-01
                            • 2013-12-20
                            • 2020-02-04
                            • 2016-02-17
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 2017-02-12
                            相关资源
                            最近更新 更多