@SpringBootApplication
@MapperScan("com.springboot.mapper")
public class Application implements WebMvcConfigurer {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
/**
* 方法一、覆盖方法configureMessageConverters,使用fastJson,
* 此处把@Bean注释掉是为了测试方式二
* @return
*/
//@Bean
public HttpMessageConverters fastJsonHttpMessageConverters() {
//1、定义一个convert转换消息的对象
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
//2、添加fastjson的配置信息
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
//3、在convert中添加配置信息
fastConverter.setFastJsonConfig(fastJsonConfig);
//4、将convert添加到converters中
HttpMessageConverter<?> converter = fastConverter;
return new HttpMessageConverters(converter);
}
//覆盖默认converters
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
//1、定义一个convert转换消息的对象
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
//2、添加fastjson的配置信息
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
//3、在convert中添加配置信息
fastConverter.setFastJsonConfig(fastJsonConfig);
//4、将convert添加到converters中
converters.add(fastConverter);
}
}
消息转换器的位置
消息转换器的目标是:HTTP输入请求格式向Java对象的转换;Java对象向HTTP输出请求的转换。有的消息转换器只支持多个数据类型,有的只支持多个输出格式,还有的两者兼备。例如:MappingJackson2HttpMessageConverter可以将Java对象转换为application/json,而ProtobufHttpMessageConverter仅支持com.google.protobuf.Message类型的输入,但是可以输出application/json、application/xml、text/plain和application/x-protobuf这么多格式。
How Do
在项目中有三种办法配置消息转换器,主要区别是可定制性和易用度的衡量。
- 在WebConfiguration类中加入@Bean定义
@Beanpublic ByteArrayHttpMessageConverter byteArrayHttpMessageConverter() {
return new ByteArrayHttpMessageConverter();
}
- 重写(override)configureMessageConverters方法,扩展现有的消息转换器链表;
@Overridepublic
void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(new ByteArrayHttpMessageConverter());
}
- 更多的控制,可以重写extendMessageConverters方法,首先清空转换器列表,再加入自定义的转换器。
@Overridepublic
void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.clear();
converters.add(new ByteArrayHttpMessageConverter());
}
分析
Spring提供了多种方法完成同样的任务,选择哪个取决于我们更侧重便捷性还是更侧重可定制性。
上述提到的三种方法各有什么不同呢?
通过@Bean定义HttpMessageConverter是向项目中添加消息转换器最简便的办法,这类似于之前提到的添加Servlet Filters。如果Spring扫描到HttpMessageConverter类型的bean,就会将它自动添加到调用链中。推荐让项目中的WebConfiguration继承自WebMvcConfigurerAdapter。
通过重写configureMessageConverters方法添加自定义的转换器很方便,但有一个弱点:如果项目中存在多个WebMvcConfigurers的实例(我们自己定义的,或者Spring Boot默认提供的),不能确保重写后的configureMessageConverters方法按照固定顺序执行。
如果需要更精细的控制:清除其他消息转换器或者清楚重复的转换器,可以通过重写extendMessageConverters完成,仍然有这种可能:别的WebMvcConfigurer实例也可以重写这个方法,但是这种几率非常小。