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

网友投稿 851 2022-07-26


目录消息转化器的作用消息转化器的主要方法默认配置的消息转化器注意事项

消息转化器的作用

将请求报文转化为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> 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方法不会覆盖默认消息转换器集合


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java中的AQS同步队列问题详解
下一篇:使用springboot整合RateLimiter限流过程
相关文章

 发表评论

暂时没有评论,来抢沙发吧~