本文首发于我的网站:Spring Boot项目中如何定制HTTP消息转换器,如需转载,请注明来源java
在构建RESTful数据服务过程当中,咱们定义了controller、repositories,并用一些注解修饰它们,可是到如今为止咱们还没执行过对象的转换——将java实体对象转换成HTTP的数据输出流。面试
Spring Boot底层经过HttpMessageConverters和Jackson库将Java实体类输出为JSON格式。当有多个转换器可用时,根据消息对象类型和须要的内容类型选择最适合的转换器使用。json
在SpringMVC源码剖析(五)-消息转换器HttpMessageConverter一文中,有一张图能够很清楚得表示消息转换器的位置。后端
消息转换器的目标是:app
有的消息转换器只支持多个数据类型,有的只支持多个输出格式,还有的二者兼备。ide
例如:MappingJackson2HttpMessageConverter能够将Java对象转换为application/json,而ProtobufHttpMessageConverter仅支持com.google.protobuf.Message类型的输入,可是能够输出application/json、application/xml、text/plain和application/x-protobuf这么多格式。优化
在项目中有三种办法配置消息转换器,主要是从可定制性和易用度两个方面进行衡量。网站
@Bean
public ByteArrayHttpMessageConverter byteArrayHttpMessageConverter() {
return new ByteArrayHttpMessageConverter();
}复制代码
@Override
public
void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(new ByteArrayHttpMessageConverter());
}复制代码
@Override
public
void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.clear();
converters.add(new ByteArrayHttpMessageConverter());
}复制代码
Spring Boot提供了多种方法完成一样的任务,选择哪一个取决于咱们更侧重便捷性仍是更侧重可定制性。google
上述提到的三种方法各有什么不一样呢?spa
经过@Bean定义HttpMessageConverter是向项目中添加消息转换器最简便的办法,这相似于以前提到的添加Servlet Filters。若是Spring扫描到HttpMessageConverter类型的bean,就会将它自动添加到调用链中。推荐让项目中的WebConfiguration继承自WebMvcConfigurerAdapter。
经过重写configureMessageConverters方法添加自定义的转换器很方便,但有一个弱点:若是项目中存在多个WebMvcConfigurers的实例(咱们本身定义的,或者Spring Boot默认提供的),不能确保重写后的configureMessageConverters方法按照固定顺序执行。
若是须要更精细的控制:清除其余消息转换器或者清楚重复的转换器,能够经过重写extendMessageConverters完成,仍然有这种可能:别的WebMvcConfigurer实例也能够重写这个方法,可是这种概率很是小。