- WebMvcConfigurer 为接口
- WebMvcConfigurerAdapter 是 WebMvcConfigurer 的实现类大部分为空方法,是 WebMvcConfigurer的子类实现,由于Java8中可以使用default关键字为接口添加默认方法,为在源代码中spring5.0之后就已经弃用本类,如果需要我接着可以实现WebMvcConfigurer类。
- WebMvcConfigurationSupport 是mvc的基本实现并包含了WebMvcConfigurer接口中的方法。
- WebMvcAutoConfiguration 是mvc的自动装在类并部分包含了WebMvcConfigurer接口中的方法。
所以一般不推荐重写WebMvcConfigurationSupport类进行配置
MVC配置方式:
- 使用@EnableWebMvc注解配置
- 继承WebMvcConfigurationSupport
- 继承 DelegatingWebMvcConfiguration 是WebMvcConfigurationSupport的拓展子类,如果项目中也存在其他实现WebMvcConfigurer接口来提供配置的类,则可以继承DelegatingWebMvcConfiguration来替代@EnableWebMvc,两者提供的功能是一样的。
其中用的比较多的是一下三个接口:
public void addCorsMappings(CorsRegistry registry) ;
void addInterceptors(InterceptorRegistry registry);
void addResourceHandlers(ResourceHandlerRegistry registry);
实例:
@Configuration
public class CommunityWebMvcConfiguration extends WebMvcConfigurationSupport {
@Autowired
ObjectMapper mapper;
@Override
protected void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new TraceInterceptor());
super.addInterceptors(registry);
}
@Override
public void configureMessageConverters(List> converters) {
converters.add(this.mappingJackson2HttpMessageConverter());
super.configureMessageConverters(converters);
}
@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
SimpleModule module = new SimpleModule();
module.addDeserializer(IPage.class, new IPageDeserializer(IPage.class));
mapper.registerModule(module);
converter.setSupportedMediaTypes(Arrays.asList(MediaType.APPLICATION_JSON, MediaType.APPLICATION_JSON_UTF8, MediaType.APPLICATION_OCTET_STREAM));
converter.setObjectMapper(mapper);
return converter;
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**").addResourceLocations(
"classpath:/static/");
registry.addResourceHandler("swagger-ui.html").addResourceLocations(
"classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**").addResourceLocations(
"classpath:/META-INF/resources/webjars/");
super.addResourceHandlers(registry);
}
}
MappingJackson2HttpMessageConverter(消息转换器)借助的是Jackson来完成序列化,那么若是可以修改Jackson的配置,便可自定义输出响应内容。
对于Date或者LocalDateTime类型,我们希望按照yyyy-MM-dd HH:mm:ss格式输出。SpringBoot默认装载了ObjectMapper到Spring容器,在yml配置文件中使用spring.jackson为前缀的配置可以修改,也可以在代码中实现Jackson2ObjectMapperBuilderCustomizer接口去修改ObjectMapper配置。
对于时间格式:
@Bean
@ConditionalOnMissingBean
public Jackson2ObjectMapperBuilderCustomizer customizer() {
return builder -> {
builder.locale(Locale.CHINA);
builder.timeZone(TimeZone.getTimeZone(ZoneId.systemDefault()));
builder.simpleDateFormat(DatePattern.NORM_DATETIME_PATTERN);
builder.modules(new MyJavaTimeModule());
};
}
public class MyJavaTimeModule extends SimpleModule {
public MyTimeModule() {
super(PackageVersion.VERSION);
this.addSerializer(LocalDateTime.class,
new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN)));
this.addSerializer(LocalDate.class,
new LocalDateSerializer(DateTimeFormatter.ofPattern(DatePattern.NORM_DATE_PATTERN)));
this.addSerializer(LocalTime.class,
new LocalTimeSerializer(DateTimeFormatter.ofPattern(DatePattern.NORM_TIME_PATTERN)));
this.addDeserializer(LocalDateTime.class,
new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN)));
this.addDeserializer(LocalDate.class,
new LocalDateDeserializer(DateTimeFormatter.ofPattern(DatePattern.NORM_DATE_PATTERN)));
this.addDeserializer(LocalTime.class,
new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DatePattern.NORM_TIME_PATTERN)));
}
}



