Spring MVC消息转换流程
1. 调用方法获取返回值
代码语言:javascript复制org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod#invokeAndHandle
Object returnValue = invokeForRequest(webRequest, mavContainer, providedArgs);
2. 获取返回值的处理器
代码语言:javascript复制org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite#handleReturnValue
//如果使用了@RequestBody,返回的就是RequestResponseBodyMethodProcessor
HandlerMethodReturnValueHandler handler = selectHandler(returnValue, returnType);
3. 使用MessageConverter转换body
代码语言:javascript复制org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor#handleReturnValue
mavContainer.setRequestHandled(true);
ServletServerHttpRequest inputMessage = createInputMessage(webRequest);
ServletServerHttpResponse outputMessage = createOutputMessage(webRequest);
//执行消息转换
// Try even with null return value. ResponseBodyAdvice could get involved.
writeWithMessageConverters(returnValue, returnType, inputMessage, outputMessage);
消息转换的逻辑
- 先确定返回消息的MediaType: 根据可接受的MediaType和接口支持MediaType取交集中的第一个
- 根据MediaType找到支持的消息转换器: 比如StringHttpMessageConverter,MappingJackson2HttpMessageConverter等
- 转换消息: GenericHttpMessageConverter#write或HttpMessageConverter#write