SpringBoot HttpMessageConverter消息转换器的使用详解

 更新时间:2022年06月07日 11:03:27   作者:骑个小蜗牛  
在整个数据流转过程中,前端的请求报文转化为Java对象,Java对象转化为响应报文,这里就用到了消息转换器HttpMessageConverter

消息转化器的作用

  • 将请求报文转化为Java对象
  • 将Java对象转化为响应报文

消息转化器的主要方法

  • getSupportedMediaTypes:获取支持的MediaType集合(如:text/html,text/plain,application/json)
  • canRead:判断是否能读(请求)
  • read:将请求数据进行格式转换(canRead方法返回值为true时调用)
  • canWrite:判断是否能写(响应)
  • write:将响应数据进行格式转换(canWrite方法返回值为true时调用)

默认配置的消息转化器

SpringMVC启动时会自动配置一些HttpMessageConverter(WebMvcConfigurationSupport类的addDefaultHttpMessageConverters)方法

源码如下:

	protected final void addDefaultHttpMessageConverters(List<HttpMessageConverter<?>> messageConverters) {
		messageConverters.add(new ByteArrayHttpMessageConverter());
		messageConverters.add(new StringHttpMessageConverter());
		messageConverters.add(new ResourceHttpMessageConverter());
		messageConverters.add(new ResourceRegionHttpMessageConverter());
		try {
			messageConverters.add(new SourceHttpMessageConverter<>());
		}
		catch (Throwable ex) {
			// Ignore when no TransformerFactory implementation is available...
		}
		messageConverters.add(new AllEncompassingFormHttpMessageConverter());
		if (romePresent) {
			messageConverters.add(new AtomFeedHttpMessageConverter());
			messageConverters.add(new RssChannelHttpMessageConverter());
		}
		if (jackson2XmlPresent) {
			Jackson2ObjectMapperBuilder builder = Jackson2ObjectMapperBuilder.xml();
			if (this.applicationContext != null) {
				builder.applicationContext(this.applicationContext);
			}
			messageConverters.add(new MappingJackson2XmlHttpMessageConverter(builder.build()));
		}
		else if (jaxb2Present) {
			messageConverters.add(new Jaxb2RootElementHttpMessageConverter());
		}
		if (jackson2Present) {
			Jackson2ObjectMapperBuilder builder = Jackson2ObjectMapperBuilder.json();
			if (this.applicationContext != null) {
				builder.applicationContext(this.applicationContext);
			}
			messageConverters.add(new MappingJackson2HttpMessageConverter(builder.build()));
		}
		else if (gsonPresent) {
			messageConverters.add(new GsonHttpMessageConverter());
		}
		else if (jsonbPresent) {
			messageConverters.add(new JsonbHttpMessageConverter());
		}
		if (jackson2SmilePresent) {
			Jackson2ObjectMapperBuilder builder = Jackson2ObjectMapperBuilder.smile();
			if (this.applicationContext != null) {
				builder.applicationContext(this.applicationContext);
			}
			messageConverters.add(new MappingJackson2SmileHttpMessageConverter(builder.build()));
		}
		if (jackson2CborPresent) {
			Jackson2ObjectMapperBuilder builder = Jackson2ObjectMapperBuilder.cbor();
			if (this.applicationContext != null) {
				builder.applicationContext(this.applicationContext);
			}
			messageConverters.add(new MappingJackson2CborHttpMessageConverter(builder.build()));
		}
	}

部分消息转换器解析

名称描述
MappingJackson2HttpMessageConverter负责读、写JSON格式数据(利用Jackson)
AllEncompassingFormHttpMessageConverter负责读、写Form表单数据
Jaxb2RootElementHttpMessageConverter负责读、写XML格式数据(使用JAXB)
ByteArrayHttpMessageConverter负责读、写二进制格式数据
StringHttpMessageConverter负责读、写字符串格式数据
ResourceHttpMessageConverter负责读、写资源文件数据
SourceHttpMessageConverter负责读、写资源数据

注意事项

系统有默认配置的消息转换器集合。

处理过程会按集合顺序匹配合适的消息转换器,如果有合适的,就会使用该消息转换器处理(读、写),后续的消息转换器不再执行。

自定义的消息转换器要想生效,必须放到集合中相同类型的消息转换器前面,原因参考第二点。

思考:既然自定义的消息转换器必须放到集合中相同类型的消息转换器前面,那是否能直接改动集合中原有的消息转换器来达到自定义的效果,而不必在加一个(暂未没研究)。

添加自定义消息转换器时注意默认消息转换器是否生效

  • WebMvcConfigurer.configureMessageConverters方法会覆盖默认消息转换器集合
  • WebMvcConfigurer.extendMessageConverters方法不会覆盖默认消息转换器集合

到此这篇关于SpringBoot HttpMessageConverter消息转换器的使用详解的文章就介绍到这了,更多相关SpringBoot HttpMessageConverter内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java开发https请求ssl不受信任问题解决方法

    java开发https请求ssl不受信任问题解决方法

    这篇文章主要介绍了java开发https请求ssl不受信任问题解决方法,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • idea 创建 maven web 工程流程(图文教程)

    idea 创建 maven web 工程流程(图文教程)

    这篇文章主要介绍了idea 创建 maven web 工程流程(图文教程),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • MyBatis的缓存解析

    MyBatis的缓存解析

    这篇文章主要介绍了MyBatis的缓存解析,一级缓存是SqlSession级别的,通过同一个SqlSession查询的数据会缓存,下次查询相同的数据就会从缓存中直接获取,不会从数据重新访问,前提必须是同一个SqlSession对象,并且查询的数据相同,需要的朋友可以参考下
    2023-09-09
  • Java实现的计算稀疏矩阵余弦相似度示例

    Java实现的计算稀疏矩阵余弦相似度示例

    这篇文章主要介绍了Java实现的计算稀疏矩阵余弦相似度功能,涉及java基于HashMap的数值计算相关操作技巧,需要的朋友可以参考下
    2018-07-07
  • Spring gateway + Oauth2实现单点登录及详细配置

    Spring gateway + Oauth2实现单点登录及详细配置

    gateway是基于 WebFlux的响应式编程框架,所以在使用securityConfig时采用的注解是@EnableWebFluxSecurity,接下来通过本文给大家介绍Spring gateway + Oauth2实现单点登录及详细配置,感兴趣的朋友一起看看吧
    2021-09-09
  • java 获取路径的各种方法(总结)

    java 获取路径的各种方法(总结)

    下面小编就为大家带来一篇java 获取路径的各种方法(总结)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08
  • Java中jstat命令的使用详解

    Java中jstat命令的使用详解

    jstat命令可以查看堆内存各部分的使用量,以及加载类的数量,下面这篇文章主要给大家介绍了关于Java中jstat命令使用的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-03-03
  • java中的编码转换过程(以utf8和gbk为例)

    java中的编码转换过程(以utf8和gbk为例)

    这篇文章主要介绍了java中的编码转换过程(以utf8和gbk为例),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • 使用@Validated 和 BindingResult 遇到的坑及解决

    使用@Validated 和 BindingResult 遇到的坑及解决

    这篇文章主要介绍了使用@Validated 和 BindingResult 遇到的坑及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • 通过实例了解java TransferQueue

    通过实例了解java TransferQueue

    这篇文章主要介绍了TransferQueue实例,下面小编和大家一起来学习一下
    2019-05-05

最新评论