4

我有自己的 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>
4

6 回答 6

4

当你覆盖 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;
}
于 2016-04-22T11:38:14.067 回答
4

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

Github 源码

@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/");
    }
}
于 2016-08-22T09:09:59.207 回答
3

覆盖requestMappingHandlerMapping()WebMvcConfigurationSupport关闭 spring boot 的自动配置。要添加自定义 MVC 组件,您可以使用 WebMvcRegistrations。就像,为了提供 custom ,我们可以用 custom RequestMappingHandlerMapping覆盖并提供它。作为,getRequestMappingHandlerMapping()RequestMappingHandlerMappingWebMvcRegistrationsAdapterwebMvcRegistrationsHandlerMapping()

@Configuration
class CustomRequestMappingHandlerMapping {

    @Bean
    public WebMvcRegistrationsAdapter webMvcRegistrationsHandlerMapping() {
        return new WebMvcRegistrationsAdapter() {
            @Override
            public RequestMappingHandlerMapping getRequestMappingHandlerMapping() {
                return new ApiVersionRequestMappingHandlerMapping("v");
            }
        };
    }
}
于 2017-07-27T03:10:53.567 回答
1

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

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

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

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

于 2018-11-09T11:28:07.933 回答
0

可以通过使用 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/");
    }
}
于 2020-03-11T08:32:14.267 回答
-1

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

@Configuration
public class VersioningMappingHandlerConfig {

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

}

注意:没有extends WebMvcConfigurationSupport,bean name 是customMappingHandlerMapping

于 2016-04-25T16:02:52.320 回答