失效原因
经常会在初始化项目的时候配置一个
HttpMessageConverter
来配置Json序列化器,但是经常配置了过后就导致SB的static-locations
配置失效,导致静态文件不显示。配置文件如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23@EnableWebMvc
@Configuration
public class GlobalConfiguration extends WebMvcConfigurationSupport {
/**
* 对象映射器
*
* @return {@link ObjectMapper}
*/
@Bean
ObjectMapper objectMapper(){
return new ObjectMapper()
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
}
@Override
protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
ObjectMapper mapper = getApplicationContext().getBean(ObjectMapper.class);
HttpMessageConverter<Object> jsonConvert = new MappingJackson2HttpMessageConverter(mapper);
converters.add(jsonConvert);
}
}这里继承了
WebMvcConfigurationSupport
并且作为一个配置的Bean。失效原因:
- 而SpringBoot对于static-locations配置进行处理的自动配置类是
WebMvcAutoConfiguration
,这个类有个注解是:@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
,即在缺失WebMvcConfigurationSupport
的Bean的时候才会启动自动配置,因此,由于上面我定义了一个WebMvcConfigurationSupport
的Bean,所以导致了配置文件失效。 - 注:
@EnableWebMvc
也不能有,其也会阻止自动配置的加载 - 注册静态资源Handler的方法为:
WebMvcConfigurerComposite#addResourceHandlers
- 而SpringBoot对于static-locations配置进行处理的自动配置类是
解决方法:
方法1:手动在代码里面添加静态资源映射(不咋推荐),这也是大部分博客给出的解决方法。
1
2
3
4
5@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("请求路径").addResourceLocations("资源路径");
super.addResourceHandlers(registry);
}方法2:通过实现
WebMvcConfigurer
来扩展配置:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22// @EnableWebMvc 注,这个也不能有,也会阻止自动配置的加载
@Configuration
public class GlobalConfiguration implements WebMvcConfigurer {
private ObjectMapper objectMapper;
/**
* 对象映射器
*
* @return {@link ObjectMapper}
*/
@Bean
ObjectMapper objectMapper(){
this.objectMapper = new ObjectMapper()
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
return objectMapper;
}
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
HttpMessageConverter<Object> jsonConvert = new MappingJackson2HttpMessageConverter(objectMapper);
converters.add(jsonConvert);
}
}
官方文档
总结
- SpringBoot对MVC的配置扩展有两种方式:
@EnableWebMvc
注解 + 继承WebMvcConfigurationSupport
,这将完全屏蔽掉SpringBoot的自动配置。- 实现
WebMvcConfigurer
接口,不会屏蔽掉SpringBoot的自动配置。
论看官方文档的重要性