当前位置: 首页 > news >正文

RequestResponseBodyMethodProcessor

既是一个参数解析器,也是一个返回结果处理器。
1.持有消息转换器的集合

protected final List<HttpMessageConverter<?>> messageConverters;

2.作为参数解析器,例如对@RequestBody标识的参数进行解析

  • 判断是否支持当前类型的参数
@Override
public boolean supportsParameter(MethodParameter parameter) {return parameter.hasParameterAnnotation(RequestBody.class);
}
  • 进行解析
    RequestResponseBodyMethodProcessor根据请求的content-type和我们的参数以及Controller对象类型等信息挨个询问每个消息转化器是否支持解析当前HTTP消息。
@Override
public Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer,NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception {parameter = parameter.nestedIfOptional();//核心的参数解析Object arg = readWithMessageConverters(webRequest, parameter, parameter.getNestedGenericParameterType());//...return adaptArgumentIfNecessary(arg, parameter);
}

readWithMessageConverters()函数会将HTTP请求体中的JSON转为我们的Java对象,主要用到转换器的**canRead()和Read()**方法,其源码如下:

@Nullable
protected <T> Object readWithMessageConverters(HttpInputMessage inputMessage, MethodParameter parameter,Type targetType) throws IOException, HttpMediaTypeNotSupportedException, HttpMessageNotReadableException {//拿到请求类型MediaType contentType;boolean noContentType = false;try {contentType = inputMessage.getHeaders().getContentType();}//...//拿到我们的参数类型和Controller类型Class<?> contextClass = parameter.getContainingClass();Class<T> targetClass = (targetType instanceof Class ? (Class<T>) targetType : null);//...//拿到HTTP请求类型HttpMethod httpMethod = (inputMessage instanceof HttpRequest ? ((HttpRequest) inputMessage).getMethod() : null);Object body = NO_VALUE;EmptyBodyCheckingHttpInputMessage message = null;try {message = new EmptyBodyCheckingHttpInputMessage(inputMessage);//开始遍历所有的HttpMessageConverter,看看谁支持将当前http请求内容转为我们的参数for (HttpMessageConverter<?> converter : this.messageConverters) {Class<HttpMessageConverter<?>> converterType = (Class<HttpMessageConverter<?>>) converter.getClass();GenericHttpMessageConverter<?> genericConverter =(converter instanceof GenericHttpMessageConverter ? (GenericHttpMessageConverter<?>) converter : null);if (genericConverter != null ? genericConverter.canRead(targetType, contextClass, contentType) ://核心就是canRead,与我们参数解析器的support()功能一致(targetClass != null && converter.canRead(targetClass, contentType))) {if (message.hasBody()) {HttpInputMessage msgToUse =getAdvice().beforeBodyRead(message, parameter, targetType, converterType);//找到HttpMessageConverter后调用read方法进行转化body = (genericConverter != null ? genericConverter.read(targetType, contextClass, msgToUse) :((HttpMessageConverter<T>) converter).read(targetClass, msgToUse));body = getAdvice().afterBodyRead(body, msgToUse, parameter, targetType, converterType);}else {body = getAdvice().handleEmptyBody(null, message, parameter, targetType, converterType);}break;}}}//...异常捕捉与日志记录return body;
}

3.作为返回值处理器,可以处理@ResponseeBody所标识方法的返回值

  • 返回值处理器处理返回值:
this.returnValueHandlers.handleReturnValue(returnValue, getReturnValueType(returnValue), mavContainer, webRequest);
public void handleReturnValue(@Nullable Object returnValue, MethodParameter returnType,ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception {HandlerMethodReturnValueHandler handler = selectHandler(returnValue, returnType);if (handler == null) {throw new IllegalArgumentException("Unknown return value type: " + returnType.getParameterType().getName());}//处理返回值handler.handleReturnValue(returnValue, returnType, mavContainer, webRequest);
}private HandlerMethodReturnValueHandler selectHandler(@Nullable Object value, MethodParameter returnType) {boolean isAsyncValue = isAsyncReturnValue(value, returnType);for (HandlerMethodReturnValueHandler handler : this.returnValueHandlers) {if (isAsyncValue && !(handler instanceof AsyncHandlerMethodReturnValueHandler)) {continue;}if (handler.supportsReturnType(returnType)) {return handler;}}return null;
}

supportsReturnType()是判断是否支持当前返回值,源码如下:

@Override
public boolean supportsReturnType(MethodParameter returnType) {return (AnnotatedElementUtils.hasAnnotation(returnType.getContainingClass(), ResponseBody.class) ||returnType.hasMethodAnnotation(ResponseBody.class));
}
  • 处理返回值
    通过内容协商确定输出信息的类型,遍历消息转换器,寻找能够支持该类型的转换器,并进行转换。主要用到的方法是canWirte()和Write()。最终可以将JaveBean对象转换为Json。

相关文章:

RequestResponseBodyMethodProcessor

既是一个参数解析器&#xff0c;也是一个返回结果处理器。 1.持有消息转换器的集合 protected final List<HttpMessageConverter<?>> messageConverters;2.作为参数解析器&#xff0c;例如对RequestBody标识的参数进行解析 判断是否支持当前类型的参数 Overrid…...

函数的极限

目录 函数的极限 函数极限的定义&#xff1a; 例题&#xff1a; 左右极限&#xff1a; 自变量趋于无穷大时函数的极限&#xff1a; 例题&#xff1a; 函数极限的性质&#xff1a; 函数极限与数列极限之间的关系&#xff1a; 函数的极限 函数极限的定义&#xff1a; 一句…...

dnf命令使用

1. 简介 DNF是新一代的rpm软件包管理器。他首先出现在 Fedora 18 这个发行版中。而最近&#xff0c;它取代了yum&#xff0c;正式成为 Fedora 22 的包管理器 DNF包管理器克服了YUM包管理器的一些瓶颈&#xff0c;提升了包括用户体验&#xff0c;内存占用&#xff0c;依赖分析…...

CLIP CLAP

文章目录CLIPabstractintroCLAP: LEARNING AUDIO CONCEPTS FROM NATURAL LANGUAGE SUPERVISIONabstractmethodCLIP open AI2021.2代码&预训练模型 abstract 原有的基于有监督数据训练的计算机分类任务&#xff0c;在面对新的分类目标时泛化性和可用性都会变差&#xff1…...

Debezium报错处理系列之五十二:解决Sql Server数据库安装后修改主机名导致sqlserver数据库实例名称没有修改从而无法设置CDC的问题

Debezium报错处理系列之五十二:解决Sql Server数据库安装后修改主机名导致sqlserver数据库实例名称没有修改从而无法设置CDC的问题 一、完整报错二、错误原因三、解决方法Debezium报错处理系列一:The db history topic is missing. Debezium报错处理系列二:Make sure that t…...

scratch老鹰捉小鸡 电子学会图形化编程scratch等级考试二级真题和答案解析2022年12月

目录 scratch老鹰捉小鸡 一、题目要求 1、准备工作 2、功能实现 二、案例分析 <...

概率论小课堂:公理化过程(大数据方法解决问题的理论基础)

文章目录 引言I 初等概率论1.1 19世纪概率论的最大难题1.2 伯努利版本的大数定理1.3 切比雪夫版本的大数定理II 现代概率论(用公理来描述概率论)2.1 柯尔莫哥洛夫2.1 用公理来描述概率论III 最基本的概率论定理3.1 互补事件的概率之和等于13.2 不可能事件的概率为零引言 前苏…...

WOW64 IsWow64Process GetNativeSystemInfoWindows System32 SysWOW64

最近开发有遇到这方面的一些知识点&#xff0c;在此记录下。首先&#xff0c;什么是WOW64&#xff1f;在知道这个之前我觉得需要了解一下&#xff0c;C:\\Windows\\System32和C:\\Winodws\\SysWOW64这两个文件夹的区别&#xff0c;Windows系统最开始的时候出的就是32bit的系统&…...

Spring Boot 3.0系列【10】核心特性篇之应用配置的高阶用法

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot版本3.0.3 源码地址:https://gitee.com/pearl-organization/study-spring-boot3 文章目录 前言1. 命令行2. JSON3. 外部化配置3.1 配置文件加载位置3.2 导入配置3.2 属性占位符4. 加密配置5. 加载YML配置文件6. 配…...

Java int类型数值比较总结

如果是int类型&#xff0c;判断相等的话直接使用 ""来判断&#xff0c;例如&#xff1a; int i 10; int j 10; System.out.print(i j)&#xff1b; 如果是Integer类型&#xff0c;则可以使用equals方法进行相等比较。 int与Integer的基本使用对比 &#xff08…...

Pyspark基础入门5_RDD的持久化方法

Pyspark 注&#xff1a;大家觉得博客好的话&#xff0c;别忘了点赞收藏呀&#xff0c;本人每周都会更新关于人工智能和大数据相关的内容&#xff0c;内容多为原创&#xff0c;Python Java Scala SQL 代码&#xff0c;CV NLP 推荐系统等&#xff0c;Spark Flink Kafka Hbase Hi…...

汽车娱乐系统解决方案

Danlaw在汽车和航空航天行业里是全球知名的技术和服务供应商&#xff0c;致力于提供更加安全与智能的系统。Danlaw以突破性技术和高效开发、动态环境的自适应解决方案而闻名。Danlaw优秀的联网汽车解决方案使之成为全球大型互联设备供应商之一。 一 信息娱乐系统测试 | 风丘科…...

Go语言结构体,这一篇就够了

Go语言结构体&#xff0c;这一篇就够了1.结构体的概念2.结构体的定义3.结构体的实例化4.结构体初始化5.构造函数6.方法和接收者方法接收者7.嵌套结构体8.结构体的“继承”9.结构体与JSON序列化10.结构体标签&#xff08;Tag&#xff09;Go语言中没有“类”的概念&#xff0c;也…...

【python】各种排序算法代码大集合

超级好用的口诀: 时间复杂度:快些以nlogn的速度归队。 稳定性:心情不稳定,快些选一堆好友来聊天吧。 直接插容易插变O(N),起泡起得好变O(N).(初始序列已经有序) 插入排序法在近乎有序的情况下,效率特别高,通过插入排序,可以引申出希尔排序 归并排序:左半部分排好序…...

K8S Pod健康检查

因为 k8s 中采用大量的异步机制、以及多种对象关系设计上的解耦&#xff0c;当应用实例数 增加/删除、或者应用版本发生变化触发滚动升级时&#xff0c;系统并不能保证应用相关的 service、ingress 配置总是及时能完成刷新。在一些情况下&#xff0c;往往只是新的 Pod 完成自身…...

NFS服务器与CGI程序详解

目录 NFS 服务器 一&#xff0c;NFS 服务器简介 二&#xff0c;NFS的使用 三&#xff0c;客户端使用 autofs 自动挂载 1&#xff0c;autofs产生的原因 四&#xff0c;autofs的安装与配置文件 五&#xff0c;autofs的使用 www服务器---cgi程序 CGI程序的应用 NFS 服务器 一&a…...

可视化项目管理,控制项目进度,项目经理需要做好以下工作

对于项目的管理者来说&#xff0c;项目信息透明&#xff0c;能够更容易让管理者发现项目中的问题&#xff0c;及时找到问题的原因和相关任务的责任人。 当项目信息能相对精准地呈现给管理者时&#xff0c;也能促进项目成员也能更加认真负责的完成任务&#xff0c;不会找借口推…...

海康工业相机使用教程

工业相机使用一、硬件连接1、准备材料2、相机供电&#xff08;1&#xff09;区分电源适配器正负极&#xff08;2&#xff09;连接相机电源线缆&#xff08;3&#xff09;连接完成后&#xff0c;相机蓝色灯常亮则成功3、软件连接&#xff08;1&#xff09;MVS客户端下载地址&…...

java开发手册之安全规约

安全规约隶属于用户个人的页面或者功能必须进行权限控制校验。 说明&#xff1a;防止没有做水平权限校验就可随意访问、修改、删除别人的数据&#xff0c;比如查看他人的私信内容、修改他人的订单。 用户敏感数据禁止直接展示&#xff0c;必须对展示数据进行脱敏。 说明&#x…...

python模块引入问题和解决方案_真方案不骗人

1.pycharm运行python脚本的过程 使用pycharm等编辑器run/debug运行python脚本时&#xff0c;编辑器会通过本地python命令全路径执行脚本&#xff0c;例如 D:\DevelopTools\Python\python.exe D:/Codes/一长串路径/bbss_nature_python/demo/test_no_param_in.py 并且会在pyth…...

Read book Netty in action(Chapter X)--Unit Testing

序言 ChannelHandler 是Netty 应用程序的关键元素&#xff0c;所以彻底地测试它们应该是你的开发过程的一个标准部分。最佳实践要求你的测试不仅要能够证明你的实现是正确的&#xff0c;而且还要能够很容易地隔离那些因修改代码而突然出现的问题。这种类型的测试叫作单元测试。…...

Appium+Python连接真机、跳过登录页、Unexpected error while obtaining UI hierarchy问题

Appium连接真机 使用数据线连接电脑&#xff0c;然后选择文件传输方式 打开手机设置拉至底部&#xff0c;点击关于手机&#xff0c;连续点击7次版本号打开开发者模式 点击设置中的系统与更新&#xff0c;找到开发者选项----> 打开USB调试即可 在终端中输入adb devices确定…...

ES6模块化

目录 一、什么是 ES6 模块化规范 二、ES6 模块化的基本语法 2.1默认导出 2.1默认导入 2.1 注意事项 2.2按需导出 2.2按需导入 2.2按需导出与按需导入的注意事项 2.3直接导入并执行模块中的代码 一、什么是 ES6 模块化规范 ES6 模块化规范是浏览器端与服务器端通用的…...

201809-3 CCF 元素选择器 满分题解(超详细注释代码) + 解题思路(超详细)

问题描述 解题思路 根据题意可以知道在查询中可以分为两种情况 第一种是查询一个标签选择器或者id选择器&#xff08;可以称为一级查询&#xff09; 第二种就是存在大于两级的查询&#xff08;可以称为多级查询&#xff09; 显然第一种查询需要存储每一种元素在内容中所有出现…...

证书拓展域(1)

证书拓展定义了数字证书的标准拓展&#xff0c;每个拓展域GB/T 16264.8-200X中定义的一个OID相关。 这些OID都是id-ce的成员&#xff0c;其定义如下&#xff1a; id-ce OBJECT IDENTIFIER :: { joint-iso-ccitt(2) ds(5) 29 }1.证书策略 certificatePolicies 1.1 定义 本…...

浅谈ChatGPT 和 对AI 的思考

新世纪以来&#xff0c;人工智能作为一个非常热门话题&#xff0c;一直收到大众的广泛的关注。从一开始的图像的分类&#xff0c;检测&#xff0c;到人脸的识别&#xff0c;到视频分析分类&#xff0c;到事件的监测&#xff0c;到基于图片的文本生成&#xff0c;到AI自动写小说…...

NCRE计算机等级考试Python真题(十二)

第十二套试题1、以下关于程序设计语言的描述&#xff0c;错误的选项是&#xff1a;A.Python语言是一种脚本编程语言B.汇编语言是直接操作计算机硬件的编程语言C.程序设计语言经历了机器语言、汇编语言、脚本语言三个阶段D.编译和解释的区别是一次性翻译程序还是每次执行时都要翻…...

Java并发类库提供的线程池有哪几种? 分别有什么特点?

第21讲 | Java并发类库提供的线程池有哪几种&#xff1f; 分别有什么特点&#xff1f; 我在专栏第 17 讲中介绍过线程是不能够重复启动的&#xff0c;创建或销毁线程存在一定的开销&#xff0c;所以利用线程池技术来提高系统资源利用效率&#xff0c;并简化线程管理&#xff0c…...

企业微信如何群发消息到客户群?

为提升工作效率&#xff0c;工作中&#xff0c;企业常常会借助企业微信的群发功能一键发送多个客户。那么企业微信如何群发消息呢&#xff1f; 其中成员个人支持群发消息到客户群&#xff0c;企业也可以创建内容提醒成员进行执行群发。 管理员支持在管理端或在手机端创建企业…...

【信号与系统笔记】第一章 绪论

1.1信号传输系统 信息传输的任务 将带有信息的信号&#xff0c;通过某种系统由发送者传送给接收者。 通信系统的组成 转换器&#xff1a;把消息转换为电信号或者把电信号还原成消息信道&#xff1a;信号传输的通道&#xff0c;广义上来说。发射机和接收机也可以是信道的一部分…...

axsure建设网站/cpa广告联盟平台

SharedPreferences是Android平台上一个轻量级的存储类,提供了Android平台常规的Long、Int、String等等类型的保存&#xff0c;可以设置权限来限定使用起来很简单。存储的数据会以XML文件的形式保存在/data/data/工程名/shared_prefs/ 目录下。 Application是用来保存全局变量的…...

一建建设网站/全网营销国际系统

在查询时,我们如果要对用户的登录信息进行加密,通常会将其密码进行加密.1) 可以借助spring框架工具类DigestUtils2) 也可以使用shiro框架来实现//保存用户自身信息//1构建一个盐值对象String saltUUID.randomUUID().toString();//随机字符串//2对密码进行盐值加密(加密算法MD5-…...

开发深圳网站建设/专业推广图片

NIS服务器的配置过程 以前在做实验的过程中总结和写的一些教程的一些资料&#xff0c;一直没时间发布到博客上面&#xff0c;五一到了&#xff0c;终于有点时间发布啦&#xff01;关于Linux上面还会有RHCE系列的学习笔记发表 NIS需要的软件包&#xff1a;rpm -ivh ypserv-2.13-…...

怎样建立自己的销售网站/今天的新闻 最新消息

随着汽车行业的发展&#xff0c;现在的纯电动车已经是值得所有消费者&#xff0c;认真考虑的购车选项了。如果说在2019年之前的新能源汽车市场还具有较为明显的政策引导色彩&#xff0c;部分消费者买电动车或者是为了占号、或是购车有优惠。但从去年到今年&#xff0c;越来越多…...

园岭中小网站建设/百度搜索推广采取

钢制球形储罐安装方法一、钢制球形储罐的构造球罐由球罐本体、支柱及附件组成。按现行的球罐系列标准有桔瓣式、足球式和混合式等型式&#xff0c;有3带、4带、5带、6带、7带等结构。桔瓣式球罐如图混合式球罐如图二、球罐常用的组装方法和许可条件(1)球罐常用的组装方法为散装…...

高端网站建设公司排名/福州排名seo公司

参考:cnblogs.com/yuanchenqi/articles/5977825.html ruanyifeng.com/blog/2015/07/flex-grammar.html jianshu.com/p/a3da5e27d22b 一.CSS概述 1.CSS概念:Cascading Style Sheets(层叠样式表)的简称 2.用途:控制网页数据的表现,可使网页的表现与数据内容分离 3.怎样找到标签;…...