继承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是通过自身的配置类(比如Swagger2DocumentationConfiguration、SpringfoxWebMvcConfiguration)来注册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




