@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);}
}