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方法,查找合适的返回值处理器

image-20241118174449820

returnValueHandlers是HandlerMethodReturnValueHandler的实现类集合,默认有15个实现类,并且有顺序

for循环依次调用其supportsReturnType方法来判断,这个handler是否可以处理当前返回值

image-20241118174730168

对于添加了@ResponseBody注解的Controller,最终会找到RequestResponseBodyMethodProcessor

@RestController注解会给所有的接口添加@ResponseBody注解

image-20241118175252997

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

之后,通过handler.handleReturnValue(returnValue, returnType, mavContainer, webRequest);

调用RequestResponseBodyMethodProcessor#handleReturnValue

# RequestResponseBodyMethodProcessor

image-20241118175745995

调用父类的writeWithMessageConverters方法

image-20241118175859057

在此方法中,通过循环messageConverters

image-20241118175930362

来依次遍历所有的消息转换器(调用其canWrite方法),是否可以处理当前返回值

# AbstractJackson2HttpMessageConverter

canWrite方法,判断目标类型及MediaType是否能被此转换器写出

支持类型为application/json

image-20241118181221921

同时通过ObjectMapper来判断,返回值是否是正常的json格式

判断通过后,返回writeWithMessageConverters方法

调用

body = getAdvice().beforeBodyWrite(body, returnType, selectedMediaType,
							(Class<? extends HttpMessageConverter<?>>) converter.getClass(),
							inputMessage, outputMessage);

# ResponseAdvice

image-20241118181556396

此方法返回后,调用

image-20241118181644323

上次更新: 2025/09/04 17:38:34