【问题标题】:Spring boot & Swagger 2 UI & custom requestmappinghandlermapping - mapping issueSpring boot & Swagger 2 UI & custom requestmappinghandlermapping - 映射问题
【发布时间】:2016-04-20 13:02:16
【问题描述】:

我有自己的 RequestMappingHandlerMapping,我正在使用 springfox-swagger-ui。添加我的自定义映射后,我无法在http://localhost:8080/swagger-ui.html 实现 swagger ui。 有什么想法吗?

这是我的配置。

    @Configuration
       public class WebMvcConfig extends WebMvcConfigurationSupport {
    @Override
    @Bean
    public RequestMappingHandlerMapping requestMappingHandlerMapping() {
        return new ApiVersionRequestMappingHandlerMapping("v");
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry
          .addResourceHandler("/webjars/**")
          .addResourceLocations("(META-INF/resources/webjars");
    }
}

这是我的 pom.xml:

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.hateoas</groupId>
        <artifactId>spring-hateoas</artifactId>
    </dependency>
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger-ui</artifactId>
        <version>2.4.0</version>
    </dependency>
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <version>2.4.0</version>
    </dependency>
    <dependency>
        <groupId>javax.inject</groupId>
        <artifactId>javax.inject</artifactId>
        <version>1</version>
    </dependency>

【问题讨论】:

    标签: spring spring-boot swagger-ui swagger-2.0 swagger-maven-plugin


    【解决方案1】:

    当你覆盖 WebMvcConfigurationSupport 时,你也在覆盖 Spring Boot 的 mvc 自动配置(WebMvcAutoConfiguration)。所以需要spring boot的配置的资源是不行的。这不是 swagger 特有的问题。

    您可以在此处找到更多信息:

    https://github.com/spring-projects/spring-boot/issues/5004

    正如 github 问题所暗示的,将来会对此进行更改以使其更容易。目前有一些解决方法,正如那里所建议的那样。

    一种快速而肮脏的方法是将 WebMvcAutoConfiguration 类复制并粘贴到您自己的类中,从 EnableWebMvcConfiguration 的 requestMappingHandlerMapping() 方法返回您自己的 HandlerMapping 并将 WebMvcAutoConfiguration 的副本注册为自动配置类。您可以在此处查看说明:

    http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-developing-auto-configuration.html

    确保将 WebMvcAutoConfiguration 的副本放在某个未自动扫描和提取组件的包中。它应该按照上面链接中的说明进行注册。

    还要确保在从 requestMappingHandlerMapping() 方法返回之前将自定义 HandlerMapping 的顺序设置为 0,如下所示:

    @Bean
    @Primary
    @Override
    public RequestMappingHandlerMapping requestMappingHandlerMapping() {
        // Must be @Primary for MvcUriComponentsBuilder to work
    
        ApiVersionRequestMappingHandlerMapping handlerMapping = new ApiVersionRequestMappingHandlerMapping("v");
        handlerMapping.setOrder(0);
        handlerMapping.setInterceptors(getInterceptors());
        handlerMapping.setContentNegotiationManager(mvcContentNegotiationManager());
    
        PathMatchConfigurer configurer = getPathMatchConfigurer();
        if (configurer.isUseSuffixPatternMatch() != null) {
            handlerMapping.setUseSuffixPatternMatch(configurer.isUseSuffixPatternMatch());
        }
        if (configurer.isUseRegisteredSuffixPatternMatch() != null) {
            handlerMapping.setUseRegisteredSuffixPatternMatch(configurer.isUseRegisteredSuffixPatternMatch());
        }
        if (configurer.isUseTrailingSlashMatch() != null) {
            handlerMapping.setUseTrailingSlashMatch(configurer.isUseTrailingSlashMatch());
        }
        if (configurer.getPathMatcher() != null) {
            handlerMapping.setPathMatcher(configurer.getPathMatcher());
        }
        if (configurer.getUrlPathHelper() != null) {
            handlerMapping.setUrlPathHelper(configurer.getUrlPathHelper());
        }
    
        return handlerMapping;
    }
    

    【讨论】:

      【解决方案2】:

      它对我有用。 覆盖 addResourceHandlers 而不是注册自动配置。

      Github Source

      @Configuration
      @EnableWebMvc
      @EnableSwagger2
      public class WebConfig extends WebMvcConfigurerAdapter {
      
          @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/");
          }
      }
      

      【讨论】:

      • 如果你扩展DelegatingWebMvcConfiguration,那么也调用super.addResourceHandlers(registry);
      • WebMvcConfigurerAdapter 已弃用。有没有一种新方法可以让它发挥作用?
      • @pitchblack408 WebMvcConfigurer 的 Javadoc 说:{@code @EnableWebMvc} 注释的配置类可以实现这个接口以被回调并有机会自定义默认配置。 所以你可能只需要implements WebMvcConfigurer 而不是extends WebMvcConfigurerAdapter
      【解决方案3】:

      覆盖WebMvcConfigurationSupportrequestMappingHandlerMapping() 将关闭spring boot 的自动配置。要添加自定义 MVC 组件,您可以使用 WebMvcRegistrations。比如,为了提供自定义RequestMappingHandlerMapping,我们可以用自定义RequestMappingHandlerMappingWebMvcRegistrationsAdapter 覆盖getRequestMappingHandlerMapping(),并通过webMvcRegistrationsHandlerMapping() 提供它。作为,

      @Configuration
      class CustomRequestMappingHandlerMapping {
      
          @Bean
          public WebMvcRegistrationsAdapter webMvcRegistrationsHandlerMapping() {
              return new WebMvcRegistrationsAdapter() {
                  @Override
                  public RequestMappingHandlerMapping getRequestMappingHandlerMapping() {
                      return new ApiVersionRequestMappingHandlerMapping("v");
                  }
              };
          }
      }
      

      【讨论】:

        【解决方案4】:

        在 Spring Boot 2.0.0 中,有一种更简单的方法可以实现这一点。

        创建WebMvcRegistrations 接口的实例作为bean 并覆盖适当的方法以返回该对象的定制版本。 Spring Boot 将读取并使用该实例。

        在这种情况下,只需覆盖 getRequestMappingHandlerMapping() 并返回自定义实现

        以上信息来自基于@Nazaret K 提供的链接的后续。 更多信息https://github.com/spring-projects/spring-boot/issues/5004

        【讨论】:

          【解决方案5】:

          可以通过使用 WebMvcConfigurationSupport 并为 swagger 添加资源处理程序来解决:

          @Configuration
          public class MvcConfiguration extends WebMvcConfigurationSupport {
              @Value("${spring.application.name}")
              private String applicationName;
          
              //...irrelevant code here
          
              @Override
              protected void addResourceHandlers(ResourceHandlerRegistry registry) {
                  registry.addResourceHandler("swagger-ui.html")
                          .addResourceLocations("classpath:/META-INF/resources/");
          
                  registry.addResourceHandler("/webjars/**")
                          .addResourceLocations("classpath:/META-INF/resources/webjars/");
              }
          }
          

          【讨论】:

            【解决方案6】:

            我终于找到了! 正确的配置是这样的:

            @Configuration
            public class VersioningMappingHandlerConfig {
            
                @Bean
                public ApiVersionRequestMappingHandlerMapping customMappingHandlerMapping() {
                    ApiVersionRequestMappingHandlerMapping handler = new ApiVersionRequestMappingHandlerMapping("v", 1, 1);
                    handler.setOrder(-1);
                    return handler;
                }
            
            }
            

            注意:没有extends WebMvcConfigurationSupport,bean 名称是customMappingHandlerMapping

            【讨论】:

            • 其实这是不正确的。如果您看到我的答案(我的答案的完整历史),您会看到这正是我作为我建议的第一个想法发布的代码,但后来我解释了为什么这不起作用。这只是在默认处理程序映射之前注册另一个 HandlerMapping。一旦您使用相同的@RequestMapping 但不同版本的网络方法,您将收到“模糊映射”错误。
            猜你喜欢
            • 2021-12-31
            • 1970-01-01
            • 2019-04-26
            • 2018-01-27
            • 1970-01-01
            • 2016-02-17
            • 2021-01-03
            • 2019-08-06
            • 2022-01-21
            相关资源
            最近更新 更多