HttpMessageConverter是Spring MVC中非常重要的一个组件,它负责将客户端提交的请求数据(如JSON、XML等)转换为Java对象,同时也负责将 Java 对象转换为客户端需要的数据格式。
SpringMVC默认会注册一些
- ByteArrayHttpMessageConverter:处理字节数组类型的数据
- StringHttpMessageConverter:处理字符串类型的数据
- FormHttpMessageConverter:处理表单类型的数据
- MappingJackson2HttpMessageConverter:用于处理JSON类型的数据
- Jaxb2RootElementHttpMessageConverter:用于处理XML类型的数据。
本文介绍MappingJackson2HttpMessageConverter
controller返回值后,开始按如下流程处理
# DispatcherServlet#doDispatch
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
将目标方法执行完成后的返回值作为视图名,设置保存到ModelAndView中
# ServletInvocableHandlerMethod#invokeAndHandle
this.returnValueHandlers.handleReturnValue(returnValue, getReturnValueType(returnValue), mavContainer, webRequest);
# HandlerMethodReturnValueHandlerComposite

HandlerMethodReturnValueHandler handler = selectHandler(returnValue, returnType);
这段代码调用本类的selectHandler方法,查找合适的返回值处理器

returnValueHandlers是HandlerMethodReturnValueHandler的实现类集合,默认有15个实现类,并且有顺序
for循环依次调用其supportsReturnType方法来判断,这个handler是否可以处理当前返回值

对于添加了@ResponseBody注解的Controller,最终会找到RequestResponseBodyMethodProcessor
@RestController注解会给所有的接口添加@ResponseBody注解

查找到之后,直接返回,然后调用HandlerMethodReturnValueHandlerComposite#handleReturnValue方法

之后,通过handler.handleReturnValue(returnValue, returnType, mavContainer, webRequest);
调用RequestResponseBodyMethodProcessor#handleReturnValue
# RequestResponseBodyMethodProcessor

调用父类的writeWithMessageConverters方法

在此方法中,通过循环messageConverters

来依次遍历所有的消息转换器(调用其canWrite方法),是否可以处理当前返回值
# AbstractJackson2HttpMessageConverter
canWrite方法,判断目标类型及MediaType是否能被此转换器写出
支持类型为application/json

同时通过ObjectMapper来判断,返回值是否是正常的json格式
判断通过后,返回writeWithMessageConverters方法
调用
body = getAdvice().beforeBodyWrite(body, returnType, selectedMediaType,
(Class<? extends HttpMessageConverter<?>>) converter.getClass(),
inputMessage, outputMessage);
# ResponseAdvice

此方法返回后,调用

← 简介