Spring Boot:定制HTTP消息转换器

在构建RESTful数据服务过程中,我们定义了controller、repositories,并用一些注解修饰它们,但是到现在为止我们还没执行过对象的转换——将java实体对象转换成HTTP的数据输出流。Spring Boot底层通过HttpMessageConverters依靠Jackson库将Java实体类输出为JSON格式。当有多个转换器可用时,根据消息对象类型和需要的内容类型选择最适合的转换器使用。

SpringMVC源码剖析(五)-消息转换器HttpMessageConverter一文中,有一张图可以很清楚得表示消息转换器的位置。

消息转换器的位置

消息转换器的目标是:HTTP输入请求格式向Java对象的转换;Java对象向HTTP输出请求的转换。有的消息转换器只支持多个数据类型,有的只支持多个输出格式,还有的两者兼备。例如:MappingJackson2HttpMessageConverter可以将Java对象转换为application/json,而ProtobufHttpMessageConverter仅支持com.google.protobuf.Message类型的输入,但是可以输出application/json、application/xml、text/plain和application/x-protobuf这么多格式。

How Do

在项目中有三种办法配置消息转换器,主要区别是可定制性易用度的衡量。

  1. 在WebConfiguration类中加入@Bean定义
@Beanpublic ByteArrayHttpMessageConverter byteArrayHttpMessageConverter() {
    return new ByteArrayHttpMessageConverter();
}
  1. 重写(override)configureMessageConverters方法,扩展现有的消息转换器链表;
@Overridepublic 
void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    converters.add(new ByteArrayHttpMessageConverter());
}
  1. 更多的控制,可以重写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实例也可以重写这个方法,但是这种几率非常小。


本号专注于后端技术、JVM问题排查和优化、Java面试题、个人成长和自我管理等主题,为读者提供一线开发者的工作和成长经验,期待你能在这里有所收获。


javaadu
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,278评论 19 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 47,227评论 6 342
  • angular内部封装了基本的JQ功能。但是,如果要使用全部功能的话,同样需要导入jqery库。而且在导入jque...
    daisx阅读 4,716评论 0 0
  • 甜滋滋的一瞬间 每一个瞬间都有它的专属的“名字”,温暖的一瞬间,感动的一瞬间……可我今天要写的,确是甜滋滋的...
    雨彩虹阅读 2,806评论 0 3

友情链接更多精彩内容