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这么多格式。
实践
在项目中有三种办法配置消息转换器,主要是从可定制性和易用度两个方面进行衡量。
- 在WebConfiguration类中加入@Bean定义
@Bean public ByteArrayHttpMessageConverter byteArrayHttpMessageConverter() { return new ByteArrayHttpMessageConverter(); }
- 重写(override)configureMessageConverters方法,扩展现有的消息转换器链表;
@Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { converters.add(new ByteArrayHttpMessageConverter()); }
- 更多的控制,可以重写extendMessageConverters方法,首先清空转换器列表,再加入自定义的转换器。
@Override public void extendMessageConverters(List<HttpMessageConverter<?>> converters) { converters.clear(); converters.add(new ByteArrayHttpMessageConverter()); }
分析
Spring Boot提供了多种方法完成同样的任务,选择哪个取决于我们更侧重便捷性还是更侧重可定制性。
上述提到的三种方法各有什么不同呢?
通过@Bean定义HttpMessageConverter是向项目中添加消息转换器最简便的办法,这类似于之前提到的添加Servlet Filters。如果Spring扫描到HttpMessageConverter类型的bean,就会将它自动添加到调用链中。推荐让项目中的WebConfiguration继承自WebMvcConfigurerAdapter。
通过重写configureMessageConverters方法添加自定义的转换器很方便,但有一个弱点:如果项目中存在多个WebMvcConfigurers的实例(我们自己定义的,或者Spring Boot默认提供的),不能确保重写后的configureMessageConverters方法按照固定顺序执行。
如果需要更精细的控制:清除其他消息转换器或者清楚重复的转换器,可以通过重写extendMessageConverters完成,仍然有这种可能:别的WebMvcConfigurer实例也可以重写这个方法,但是这种几率非常小。
Spring Boot 1.x系列
本号专注于后端技术、JVM问题排查和优化、Java面试题、个人成长和自我管理等主题,为读者提供一线开发者的工作和成长经验,期待你能在这里有所收获。
- springBoot 定制HTTP消息转换器 返回对象只为null或者空值的字段处理
- 如何把spring boot项目部署到tomcat容器中
- spring boot项目如何启动
- idear如何创建一个spring boot项目
- 在springboot中,如何做到当项目启动的时候去执行这个逻辑
- springboot项目如何创建?idea?02
- elasticsearch?idea中如何创建springbootelasticsearch项目?
- spring boot框架学习7-spring boot的web开发(3)-自定义消息转换器
- 如何快速创建一个Spring Boot项目
- springmvc HttpMessageConverter(http消息转换器)
- springboot项目中定时任务如何优雅退出
- 如何通过域名访问阿里云部署的springboot项目
- idea如何创建springboot项目?
- 学习第一天:如何打包spring boot项目
- 导入时如何定制spring-boot依赖项的版本
- 将消息中心改造成springboot项目,并集成maven打包docker image
- intellij idea如何将基于Springboot的web项目打成war包
- 如何在Spring Boot项目使用参数校验
- 第二十八章 springboot + zipkin(brave定制-AsyncHttpClient)
- (30)导入时如何定制spring-boot依赖项的版本【转载】【从零开始学Spring Boot】