You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

继承DelegatingWebMvcConfiguration导致Swagger页面404问题咨询

问题原因分析与解决方案

这个问题我之前也碰到过,核心根源在于继承DelegatingWebMvcConfiguration会覆盖Spring Boot的Web MVC自动配置逻辑,进而导致Swagger依赖的关键映射丢失,具体拆解如下:

为什么会出现这个问题?

1. DelegatingWebMvcConfiguration的特殊作用

DelegatingWebMvcConfiguration是Spring MVC提供的自定义Web配置基类,它是WebMvcConfigurationSupport的子类。而Spring Boot的WebMvcAutoConfiguration(负责自动配置静态资源、消息转换器等核心Web功能)带有@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)注解——也就是说,当你自己定义了继承WebMvcConfigurationSupport的类时,Spring Boot的自动配置会直接失效。

Swagger的UI页面是静态资源,API文档的请求映射也依赖Spring MVC的默认配置支持,自动配置失效后这些映射自然就找不到了,所以会抛出No mapping found的警告。

2. Swagger的映射注册逻辑

Swagger 2.7.0是通过自身的配置类(比如Swagger2DocumentationConfigurationSpringfoxWebMvcConfiguration)来注册API文档处理器和静态资源映射的,但这些配置依赖于Spring Boot的Web自动配置环境。当你替换了WebMvcConfigurationSupport的实现后,Swagger的这些映射不会被自动加载到你的自定义配置中。

解决办法

方案一:改用@WebMvcConfigurer接口(推荐)

如果你的需求只是自定义RequestMappingHandlerAdapter,完全不需要继承DelegatingWebMvcConfiguration,实现@WebMvcConfigurer接口即可——这种方式不会覆盖Spring Boot的自动配置,Swagger的功能也能正常保留:

@Configuration
public class CustomWebMvcConfig implements WebMvcConfigurer {
    @Override
    public void configureHandlerAdapters(List<HandlerAdapter> adapters) {
        // 自定义你的RequestMappingHandlerAdapter逻辑
        RequestMappingHandlerAdapter customAdapter = new RequestMappingHandlerAdapter();
        // 按需设置自定义属性,比如消息转换器、参数解析器等
        adapters.add(customAdapter);
    }
}

方案二:必须继承DelegatingWebMvcConfiguration时的处理

如果因为特殊需求必须继承该类,需要手动导入Swagger的配置并添加静态资源映射:

@Configuration
// 手动导入Swagger的核心配置类
@Import({SpringfoxWebMvcConfiguration.class, Swagger2DocumentationConfiguration.class})
public class CustomDelegatingWebMvcConfig extends DelegatingWebMvcConfiguration {

    // 添加Swagger静态资源映射
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        super.addResourceHandlers(registry);
        registry.addResourceHandler("swagger-ui.html")
                .addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/");
    }

    // 自定义RequestMappingHandlerAdapter时,务必调用super方法保留默认适配器
    @Override
    protected void configureHandlerAdapters(List<HandlerAdapter> adapters) {
        super.configureHandlerAdapters(adapters);
        // 你的自定义适配器逻辑
        RequestMappingHandlerAdapter customAdapter = new RequestMappingHandlerAdapter();
        // 建议复制默认适配器的核心配置(比如消息转换器),避免其他功能失效
        adapters.add(customAdapter);
    }
}

⚠️ 注意:重写configureHandlerAdapters时一定要调用super.configureHandlerAdapters(adapters),否则会丢失Spring MVC默认的请求处理器,不仅Swagger,普通Controller的请求也会失效。

内容的提问来源于stack exchange,提问作者m52509791

火山引擎 最新活动