一、内容协商原理
HttpMessageConverter
定制
HttpMessageConverter来实现多端内容协商编写
WebMvcConfigurer提供的configureMessageConverters底层,修改底层的MessageConverter
@ResponseBody由HttpMessageConverter处理标注了
@ResponseBody的返回值 将会由支持它的HttpMessageConverter写给浏览器1、如果controller方法的返回值标注了
@ResponseBody注解🍕、请求进来先来到
DispatcherServlet的doDispatch()进行处理🍔、找到一个
HandlerAdapter适配器。利用适配器执行目标方法🍟、
RequestMappingHandlerAdapter来执行,调用invokeHandlerMethod()来执行目标方法。🌭、目标方法执行之前:①、
HandlerMethodArgumentResolver:参数解析器,确定目标方法每个参数值。②、HandlerMethodReturnValueHandler:返回值处理器,确定目标方法的返回值改怎么处理。🧂、
RequestMappingHandlerAdapter里面的invokeAndHandle()真正执行目标方法。🥓、目标方法执行完成,会返回返回值对象。
🥚、找到一个合适的返回值处理器
HandlerMethodReturnValueHandler
🍳、最终找到RequestResponseBodyMethodProcessor能处理 标注了@ResponseBody注解的方法。🧇、
RequestResponseBodyMethodProcessor调用writeWithMessageConverters,利用MessageConverter把返回值写出去。2、
HttpMessageConverter会先进行内容协商🥞、遍历所有的
MessageConverter看谁支持这种内容类型的数据。🧈、默认
MessageConverter有以下
🥨、最终因为要
json所以MappingJackson2HttpMessageConverter支持写出json。🥯、jackson用
ObjectMapper把对象写出去。
WebMvcAutoConfiguration提供几种默认HttpMessageConverters
EnableWebMvcConfiguration通过addDefaultHttpMessageConverters添加了默认的MessageConverter。
ByteArrayHttpMessageConverter: 支持字节数据读写
StringHttpMessageConverter: 支持字符串读写ResourceHttpMessageConverter:支持资源读写ResourceRegionHttpMessageConverter: 支持分区资源写出AllEncompassingFormHttpMessageConverter:支持表单xml/json读写MappingJackson2HttpMessageConverter: 支持请求响应体Json读写
系统提供默认的MessageConverter 功能有限,仅用于json或者普通返回数据。额外增加新的内容协商功能,必须增加新的
HttpMessageConverter





















