SpringBoot---web-->>ReturnValueHandle输出原理

本文深入解析SpringBoot的ReturnValueHandler在处理控制器返回值时的转换原理。通过源码分析,从handleReturnValue方法开始,详细描述了如何设置请求状态、创建InputMessage和OutputMessage,以及如何在寻找合适的数据格式进行转换的过程。最终展示了如何将结果转化为JSON并完成响应。
摘要由CSDN通过智能技术生成

ReturnValueHandle输出原理

直接源码,接着上面学,来到handleReturnValue方法,具体被执行的这一行

handler.handleReturnValue(returnValue, returnType, mavContainer, webRequest);

进入后,来到方法的具体执行,方法首先是设置了一个执行第一行告诉程序当前请求已经在这个控制器方法中被处理了。去哪个方法里,能看见注释。

然后就是创建一个输入报文和输出报文,然后再用最后一行

public void handleReturnValue(@Nullable Object returnValue, MethodParameter returnType,
      ModelAndViewContainer mavContainer, NativeWebRequest webRequest)
      throws IOException, HttpMediaTypeNotAcceptableException, HttpMessageNotWritableException {
​
   mavContainer.setRequestHandled(true);
   ServletServerHttpRequest inputMessage = createInputMessage(webRequest);
   ServletServerHttpResponse outputMessage = createOutputMessage(webRequest);
​
   // Try even with null return value. ResponseBodyAdvice could get involved.
    //设置请求响应值,即使是null也要尝试,这可能会涉及请求协议,就是请求时控制台里头的RequestHeader里面的Accept内容,就是请求协商【就是浏览器告诉服务器我支持什么类型的数据,你好给我显示】
    //看方法名字也就知道这一句是将控制器方法返回结果转换为响应报文输出
   writeWithMessageConverters(returnValue, returnType, inputMessage, outputMessage);
}

进入后会来到一个很长很长的方法里,在这个方法里会实现对返回结果尝试转换为响应报文的流程

protected <T> void writeWithMessageConverters(@Nullable T value, MethodParameter returnType,
      ServletServerHttpRequest inputMessage, ServletServerHttpResponse outputMessage)
      throws IOException, HttpMediaTypeNotAcceptableException, HttpMessageNotWritableException {
​
   Object body;
   Class<?> valueType;
   Type targetType;
//判断是不是字符序列,当前是一个user对象
   if (value instanceof CharSequence) {
      body = value.toString();
      valueType = String.class;
      targetType = String.class;
   }
   else {
       //把返回值内容赋值给body【Object类型】
      body = value;
       //给body找返回结果类型
      valueType = getReturnValueType(body, returnType);
       //给body找最后转换的类型
      targetType = GenericTypeResolver.resolveType(getGenericType(returnType), returnType.getContainingClass());
   }
    //是不是资源文件,不是
   if (isResourceType(value, returnType)) {
      outputMessage.getHeaders().set(HttpHeaders.ACCEPT_RANGES, "bytes");
      if (value != null && inputMessage.getHeaders().getFirst(HttpHeaders.RANGE) != null &&
            outputMessage.getServletResponse().getStatus() == 200) {
         Resource resource = (Resource) value;
         try {
            List<HttpRange> httpRanges = inputMessage.getHeaders().getRange();
            outputMessage.getServletR
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值