检查项目是否有其他配置实现了 extends WebMvcConfigurationSupport,如果有就是这个配置导致实现implements WebMvcConfigurer的配置不生效。
我的问题项目有imgconfig,和webconfig
@Configuration
public class ImgConfig extends WebMvcConfigurationSupport {
@Override
public 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 {
@Resource
private CurrentUserMethodArgumentResolver currentUserMethodArgumentResolver;
@Override
public 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 {
@Override
public 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 {
@Resource
private CurrentUserMethodArgumentResolver currentUserMethodArgumentResolver;
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
String property = System.getProperty("user.dir").concat(File.separator);
registry.addResourceHandler("/**").addResourceLocations("file:" + property);
}
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(currentUserMethodArgumentResolver);
}
}