本文首发于个人网站:Spring Boot项目中如何定制HTTP消息转换器,如需转载,请注明来源

在构建RESTful数据服务过程中,我们定义了controller、repositories,并用一些注解修饰它们,但是到现在为止我们还没执行过对象的转换——将java实体对象转换成HTTP的数据输出流。

Spring Boot底层通过HttpMessageConverters和Jackson库将Java实体类输出为JSON格式。当有多个转换器可用时,根据消息对象类型和需要的内容类型选择最适合的转换器使用。

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

消息转换器的目标是:

  1. HTTP输入请求格式向Java对象的转换;
  1. Java对象向HTTP输出请求的转换。

有的消息转换器只支持多个数据类型,有的只支持多个输出格式,还有的两者兼备。

例如:MappingJackson2HttpMessageConverter可以将Java对象转换为application/json,而ProtobufHttpMessageConverter仅支持com.google.protobuf.Message类型的输入,但是可以输出application/json、application/xml、text/plain和application/x-protobuf这么多格式。

实践

在项目中有三种办法配置消息转换器,主要是从可定制性易用度两个方面进行衡量。

  1. 在WebConfiguration类中加入@Bean定义
@Bean
public ByteArrayHttpMessageConverter byteArrayHttpMessageConverter() {return new ByteArrayHttpMessageConverter();
}

  1. 重写(override)configureMessageConverters方法,扩展现有的消息转换器链表;
@Override
public
void configureMessageConverters(List<HttpMessageConverter<?>> converters) {converters.add(new ByteArrayHttpMessageConverter());
}

  1. 更多的控制,可以重写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系列

  1. Spring Boot的自动配置、Command-line-Runner
  2. 了解Spring Boot的自动配置
  3. Spring Boot的@PropertySource注解在整合Redis中的使用

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

json txt格式转换器_SpringBoot项目中如何定制HTTP消息转换器相关推荐

  1. 面试精讲之面试考点及大厂真题 - 分布式专栏 13项目中为什么要使用消息队列

    13项目中为什么要使用消息队列 学习从来无捷径,循序渐进登高峰. -- 高永祚 引言 上个章节把Redis夺命连环问掰扯完,面试还没有结束,消息队列同样是面试中必问的,分布式构建三把斧:缓存+异步+数 ...

  2. java抢购防止多次请求_springboot项目中接口防止恶意请求多次

    springboot项目中接口防止恶意请求多次 在项目中,接口的暴露在外面,很多人就会恶意多次快速请求,那我们开发的接口和服务器在这样的频率下的话,服务器和数据库很快会奔溃的,那我们该怎么防止接口防刷 ...

  3. pagehelper的使用_SpringBoot项目中,如何更规范的使用PageHelper分页?

    SpringBoot项目中,如何更规范的使用PageHelper分页,拉勾IT课小编为大家分解 一. 开发准备 1. 开发工具 • IntelliJ IDEA 2020.2.3 2. 开发环境 • R ...

  4. mysql连接规定时区以及编码_springboot项目中使用mysql连接遇到时区timezone问题,和编码encoding问题解决...

    springboot项目中使用mysql连接遇到时区timezone问题,和编码encoding问题解决 问题原因 1.application.properties的设置 1.1spring.data ...

  5. autowired注入jar中的依赖_springboot项目中调用jar包中的类时报错 — 没有注入类

    使用场景:将一些公共的方法封装成了一个jar包,在其他项目中进行引用的时候报错 报错原因:bean没有注入 因为这两个类没有被@Service,@Repository等类注解,如果我们想用@Autow ...

  6. json txt格式转换器_BIOM:生物观测矩阵——微生物组数据通用数据格式

    简介 http://biom-format.org/ BIOM格式是微生物组领域最常用的结果保存格式,优点是可将OTU或Feature表.样本属性.物种信息等多个表保存于同一个文件中,且格式统一,体积 ...

  7. 自己虚拟服务器都用json可以吗,vue+webpack项目中使用dev-server搭建虚拟服务器,请求json文件数据,实现前后台分离开发...

    在项目开发中,前后台分离,做了假数据,项目使用vue2.0重构,后台也推到重来了,为了不耽误开发进程,我做了虚拟的数据请求,使用vue-cli脚手架搭建的项目文件中dev-server搭建虚拟api请 ...

  8. php text转json,txt格式怎么转json格式

    txt转json格式的方法:首先打开相应的代码脚本文件:然后通过[ReadTextToJson();]方法读取TXT文件并转化为Json即可. JSON是一种轻量级的数据交换格式.它基于 ECMASc ...

  9. spring boot 注解_Spring-Boot项目中如何配置redis注解缓存?

    在pom中添加redis缓存支持依赖 <dependency><groupId>org.springframework.boot</groupId><arti ...

最新文章

  1. 中国现代化进程专题讲座——有感
  2. 【MySQL】MySQL的索引
  3. java Annotation 简单理解
  4. 使用nginx搭建https服务器
  5. java request 处理过程_小猿圈Java开发之从代码看spring mvc请求处理过程
  6. 甜蜜暴击情人节海报PSD分层模板|让人眼前一亮
  7. 浏览器分辨率使用排名以及不同分辨率下的网页测试
  8. ghost错误代码大全
  9. POJ 1252 Euro Efficiency G++ 完全背包 背
  10. 微信下载app需要点击右上角在浏览器中打开下载的解决办法
  11. 导向滤波与opencv python实现
  12. 输入N,打印对应N行的图案。
  13. shader三种变量类型(uniform,attribute和varying)
  14. 提高RM-MEDA局部学习(IRM-MEDA)
  15. python刷阅读_Python 刷高博客阅读量
  16. html怎么自动导入数据并排序,jQuery html表格排序插件:tablesorter
  17. 2018年广东工业大学文远知行杯新生程序设计竞赛 1012 只有我不在的世界β
  18. 我放弃了VMware
  19. 348个实用电路图大全
  20. K8S学习笔记之Service和kube-proxy

热门文章

  1. Java线程之Synchronized用法
  2. CDH HUE集成MySQL
  3. Spark常规性能调优一:最优资源配置
  4. python3数据类型:List列表
  5. 在千万级的数据库查询中,如何提高效率?
  6. MySQL Percona PXC集群实现MySQL主从复制强一致性
  7. MySQL日期及时间加减函数
  8. Mybatis的@Param注解作用
  9. SQL Server 创建存储过程
  10. 第一行代码学习笔记第七章——探究内容提供器