@Configuration注解对应实现implements WebMvcConfigurer的配置不生效问题。
检查项目是否有其他配置实现了 extends WebMvcConfigurationSupport,如果有就是这个配置导致实现implements WebMvcConfigurer的配置不生效。
我的问题项目有imgconfig,和webconfig
@Configuration
public class ImgConfig extends WebMvcConfigurationSupport {@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {String property = System.getProperty("user.dir").concat(File.separator);System.err.println("映射地址:"+property);registry.addResourceHandler("/**").addResourceLocations("file:"+property);}}
@Configuration
public class WebConfig implements WebMvcConfigurer {@Resourceprivate CurrentUserMethodArgumentResolver currentUserMethodArgumentResolver;@Overridepublic void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {resolvers.add(currentUserMethodArgumentResolver);}
}
我在下面代码处打断点 ,重启程序发现没有执行,由此判断webconfig的add没有执行。
resolvers.add(currentUserMethodArgumentResolver);问题原因:Spring Boot 的 WebMvcAutoConfiguration 自动配置类通过条件注解 @ConditionalOnMissingBean(WebMvcConfigurationSupport.class) 判断是否生效。如果存在继承 WebMvcConfigurationSupport 的类(如 ImgConfig),所有默认的 MVC 配置会被禁用,包括其他 WebMvcConfigurer 实现类的配置。
 
 
解决方案1:统一使用 WebMvcConfigurer
 
将 ImgConfig 改为实现 WebMvcConfigurer 接口,避免继承 WebMvcConfigurationSupport
所有配置类均通过 WebMvcConfigurer 实现,Spring 会自动合并多个配置类的逻辑
@Configuration
public class ImgConfig implements WebMvcConfigurer {@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {String property = System.getProperty("user.dir").concat(File.separator);registry.addResourceHandler("/**").addResourceLocations("file:" + property);}
}解决方案2:合并配置到一个类
@Configuration
public class CombinedConfig implements WebMvcConfigurer {@Resourceprivate CurrentUserMethodArgumentResolver currentUserMethodArgumentResolver;@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {String property = System.getProperty("user.dir").concat(File.separator);registry.addResourceHandler("/**").addResourceLocations("file:" + property);}@Overridepublic void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {resolvers.add(currentUserMethodArgumentResolver);}
}