ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

24.ReturnValueHandler原理

2022-08-08 13:30:09  阅读:168  来源: 互联网

标签:24 处理 person 处理器 返回值 类型 ReturnValueHandler 原理 class


@Controller
public class ResponseTestController {
 
    @ResponseBody
    @GetMapping("/test/person")
    public Person getPerson(){
        Person person = new Person();
        person.setAge(4);
        person.setBirth(new Date());
        person.setUserName("zhangsan");
        return person;
    }
}

我们从这里开始分析,invokeForRequest()是处理请求并得到返回值, 
if (returnValue == null) :此时返回值不为空
else if (StringUtils.hasText(getResponseStatusReason())):判断是否有返回失败的原因
此时会调用this.returnValueHandlers.handleReturnValue(returnValue,getReturnValueType(returnValue), mavContainer, webRequest)处理返回值

 进入handleReturnValue,第一步是寻找合适的处理器,第二步是用处理器处理 

进入selectHandler,

isAsyncReturnValue(value, returnType):是不是异步返回值

 进入isAsyncReturnValue,在15个处理器里进行寻找,最终返回false

 

image.png

 返回值处理器原理:

1、返回值处理器判断是否支持这种类型返回值 supportsReturnType

2、返回值处理器调用 handleReturnValue 进行处理

进入 handler.supportsReturnType(returnType),下图是第一个处理器判断的方法,通过比较是不是ModelAndView类型判断 

最终:RequestResponseBodyMethodProcessor 可以处理返回值标了@ResponseBody 注解的

得到处理器之后,进入handle.handleReturnValue方法,这是最终处理返回值的方法

writeWithMessageConverters(returnValue, returnType, inputMessage, outputMessage):使用消息转换器进行写出操作,利用 MessageConverters 进行处理 将数据写为json

 进入writeWithMessageConverter,首先判断是不是字符串类型,不是进入else,进入else语句拿到person对象和类型,目标类型

 

if (isResourceType(value, returnType)):判断是不是资源类型,
acceptableTypes:浏览器能接受的类型
producibleTypes:服务器能生产的类型 

两个for循环进行匹配

  HttpMessageConverter: 看是否支持将 此 Class类型的对象,转为MediaType类型的数据。

例子:Person对象转为JSON。或者 JSON转为Person

 

进入convert.canwrite可查看各种解析器支持什么类型

0 - 只支持Byte类型的

1 - String

2 - String

3 - Resource

4 - ResourceRegion

5 - DOMSource.class \ SAXSource.class) \ StAXSource.class \StreamSource.class \Source.class

6 - MultiValueMap

7 - true

8 - true

9 - 支持注解方式xml处理的。

 

最终得到的解析器是MappingJackson2HttpMessageConverter

genericConverter.write(body, targetType, selectedMediaType, outputMessage):写json数据

 进入write方法,首先是添加响应头,然后进入else语句,通过writeInternal操作

返回值解析器原理:

1、返回值处理器判断是否支持这种类型返回值 supportsReturnType
2、返回值处理器调用 handleReturnValue 进行处理
3、RequestResponseBodyMethodProcessor 可以处理返回值标了@ResponseBody 注解的。
   1. 利用 MessageConverters 进行处理 将数据写为json
        1、内容协商(浏览器默认会以请求头的方式告诉服务器他能接受什么样的内容类型)
        2、服务器最终根据自己自身的能力,决定服务器能生产出什么样内容类型的数据,
        3、SpringMVC会挨个遍历所有容器底层的 HttpMessageConverter ,看谁能处理?
             1、得到MappingJackson2HttpMessageConverter可以将对象写为json
             2、利用MappingJackson2HttpMessageConverter将对象转为json再写出去。

标签:24,处理,person,处理器,返回值,类型,ReturnValueHandler,原理,class
来源: https://www.cnblogs.com/55zjc/p/16561494.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有