1. 我们先来看看框架会自动注册哪些httpmessageconvert? 在哪个地方开始注册的?

在对mvc:annotation-driven解析的AnnotationDrivenBeanDefinitionParser中,有这么一个方法:

ManagedList<?> messageConverters = getMessageConverters(element, source, parserContext);

获取所有的HttpMessageConverter,最终设置到RequestMappingHandlerAdapter的private List<HttpMessageConverter<?>> messageConverters属性上。看下具体的获取过程:

private ManagedList<?> getMessageConverters(Element element, Object source, ParserContext parserContext) {Element convertersElement = DomUtils.getChildElementByTagName(element, "message-converters");ManagedList<? super Object> messageConverters = new ManagedList<Object>();if (convertersElement != null) {messageConverters.setSource(source);for (Element beanElement : DomUtils.getChildElementsByTagName(convertersElement, "bean", "ref")) {Object object = parserContext.getDelegate().parsePropertySubElement(beanElement, null);messageConverters.add(object);}}if (convertersElement == null || Boolean.valueOf(convertersElement.getAttribute("register-defaults"))) {messageConverters.setSource(source);messageConverters.add(createConverterDefinition(ByteArrayHttpMessageConverter.class, source));RootBeanDefinition stringConverterDef = createConverterDefinition(StringHttpMessageConverter.class, source);stringConverterDef.getPropertyValues().add("writeAcceptCharset", false);messageConverters.add(stringConverterDef);messageConverters.add(createConverterDefinition(ResourceHttpMessageConverter.class, source));messageConverters.add(createConverterDefinition(SourceHttpMessageConverter.class, source));messageConverters.add(createConverterDefinition(AllEncompassingFormHttpMessageConverter.class, source));if (romePresent) {messageConverters.add(createConverterDefinition(AtomFeedHttpMessageConverter.class, source));messageConverters.add(createConverterDefinition(RssChannelHttpMessageConverter.class, source));}if (jackson2XmlPresent) {RootBeanDefinition jacksonConverterDef = createConverterDefinition(MappingJackson2XmlHttpMessageConverter.class, source);GenericBeanDefinition jacksonFactoryDef = createObjectMapperFactoryDefinition(source);jacksonFactoryDef.getPropertyValues().add("createXmlMapper", true);jacksonConverterDef.getConstructorArgumentValues().addIndexedArgumentValue(0, jacksonFactoryDef);messageConverters.add(jacksonConverterDef);}else if (jaxb2Present) {messageConverters.add(createConverterDefinition(Jaxb2RootElementHttpMessageConverter.class, source));}if (jackson2Present) {RootBeanDefinition jacksonConverterDef = createConverterDefinition(MappingJackson2HttpMessageConverter.class, source);GenericBeanDefinition jacksonFactoryDef = createObjectMapperFactoryDefinition(source);jacksonConverterDef.getConstructorArgumentValues().addIndexedArgumentValue(0, jacksonFactoryDef);messageConverters.add(jacksonConverterDef);}else if (gsonPresent) {messageConverters.add(createConverterDefinition(GsonHttpMessageConverter.class, source));}}return messageConverters;}

该过程第一步: 
    解析并获取我们自定义的HttpMessageConverter,

并在xml中配置

<mvc:annotation-driven>  <mvc:message-converters register-defaults="false">  <bean class="org.springframework.http.converter.StringHttpMessageConverter">  <constructor-arg value="UTF-8"/>  </bean>  </mvc:message-converters>  </mvc:annotation-driven>  

该过程第二步:

< mvc:message-converters register-defaults="true">有一个register-defaults属性,当为true时,仍然注册默认的HttpMessageConverter,当为false则不注册,仅仅使用用户自定义的HttpMessageConverter。

获取完毕,便会将这些HttpMessageConverter设置进RequestMappingHandlerAdapter的messageConverters属性中。

2. HttpMessageConvert的使用

举个例子:

@RequestMapping(value="/string", method=RequestMethod.POST)
public @ResponseBody String readString(@RequestBody String string) {return "Read string '" + string + "'";
}

在SpringMVC进入readString方法前,会根据@RequestBody注解选择适当的HttpMessageConverter实现类来将请求参数解析到string变量中,具体来说是使用了StringHttpMessageConverter类,它的canRead()方法返回true,然后它的read()方法会从请求中读出请求参数,绑定到readString()方法的string变量中。

当SpringMVC执行readString方法后,由于返回值标识了@ResponseBody,SpringMVC将使用StringHttpMessageConverter的write()方法,将结果作为String值写入响应报文,当然,此时canWrite()方法返回true。

转载于:https://www.cnblogs.com/whx7762/p/8124600.html

HttpMessageConvert相关推荐

  1. Spring MVC 4.1 支持jsonp

    2019独角兽企业重金招聘Python工程师标准>>> 使用ResponseBodyAdvice支持jsonp ResponseBodyAdvice是一个接口,接口描述, packa ...

  2. 78. Spring Boot完美使用FastJson解析JSON数据【从零开始学Spring Boot】

    [原创文章,转载请注明出处] 个人使用比较习惯的json框架是fastjson,所以spring boot默认的json使用起来就很陌生了,所以很自然我就想我能不能使用fastjson进行json解析 ...

  3. java web乱码_【SpringBoot WEB 系列】RestTemplate 之中文乱码问题 fix

    [WEB 系列]RestTemplate 之中文乱码问题 fix 在 RestTemplate 基础用法博文中,post json 表单时,会发现存在中文乱码问题,本文主要介绍对应的解决方案 I. 中 ...

  4. 从零开始学springboot笔记(二)-Spring boot返回json数据(中文无乱码)

    先创建json实体类,如下: public class Demo {private int age; private String address; private String name; priv ...

  5. SpringBoot学习之路:06.Spring Boot替换默认的Jackson

    2019独角兽企业重金招聘Python工程师标准>>> SpringBoot和Springmvc都可以返回接送数据,SpringBoot默认是使用Jackson解析json数据的,个 ...

  6. SpringMVC 文件上传及下载

    文件下载 inline 访问资源时如果没有设置响应头Content-Disposition,浏览器默认按照inline进行处理 inline:能显示就显示,不能显示就下载 响应头 只需修改响应头Con ...

  7. java框架之SpringBoot(5)-SpringMVC的自动配置

    本篇文章内容详细可参考官方文档第 29 节. SpringMVC介绍 SpringBoot 非常适合 Web 应用程序开发.可以使用嵌入式 Tomcat,Jetty,Undertow 或 Netty ...

  8. SpringMVC —— @ResponseBody原理

    目的 @ResponseBody可以添加在控制器类或其下方法中,这样在请求结果对象返回时能够将其解析为JSON格式,这是如何实现的呢? 文章目的在于梳理@ResponseBody实现的原理 引子 先看 ...

  9. spring mvc的DataBinder、Validator、BeanWrapper、ConversionService、Formatter

    很多人对spring mvc的请求处理流程都不陌生,今天我们要展开讲解的是请求体数据body的绑定.验证.格式化.类型转换,它是怎样实现的呢?其实就是大家熟悉的HandlerAdapter干的事情. ...

  10. springboot尚硅谷雷神学习笔记

    学习要求 熟悉Spring基础 熟悉Maven使用 环境要求 Java8及以上 Maven 3.3及以上:https://docs.spring.io/spring-boot/docs/current ...

最新文章

  1. Spring Integration学习资料
  2. python中turtle画酷炫图案-酷炫的动态可视化交互大屏,用Excel就能做!
  3. vue - resource 使用过程的坑
  4. matlab 光谱噪声,环境小卫星高光谱影像条纹噪声去除程序IDL版
  5. ajax php 返回数组并父子给变量,将字符串变量从PHP发送回数组变量的ajax ...?
  6. ORACLE定期清理INACTIVE会话
  7. 给你出道题---最佳组合问题
  8. C语言编辑飘扬的红旗代码,C语言 飘动的红旗(要有旗杆)
  9. [十]JavaIO之FilterInputStream FilterOutputStream
  10. oracle滚动统计,sql – 按月滚动或运行Oracle总计
  11. vs的windows应用程序上的鼠标为什么一直是加载状态?_了解 JavaScript 应用程序中的内存泄漏...
  12. 北京54坐标系转经纬度坐标系教程
  13. 中班音乐计算机创编,幼儿园中班音乐教学方案创意实用篇
  14. 习题4-1 Xiangqi UVA - 1589
  15. stm32语音识别文字显示_『免费开源』基于STM32的之语音识别
  16. python文献翻译_英文学术文献翻译软件有哪些推荐?
  17. 荣耀猎人游戏本散热怎么样?测试一下就知道
  18. OSChina 周日乱弹 —— 生活就像巧克力
  19. 力扣347 前 K 个高频元素 -- JS
  20. Soot的安装及其初步使用

热门文章

  1. 安装Vue +webpack ,以及出现的问题d的解决
  2. 虚拟机无法将文件......DVD1.iso作为映像进行连接:找不到该文件
  3. JVM stack与Heap的区别
  4. C++中用stringstream类进行数据类型的转换
  5. 如何通过git客户端上传项目到github上
  6. 采用Cloudera-Manager安装CDH时,采用内嵌数据库各数据库用户密码的保存位置
  7. mysql强制编码导出、导入数据
  8. 多图片的合并(2种方式,可以设置间距)
  9. 求助:如何得知文件下载了多少大?
  10. MoneyRunner API汇总