前端到接口层的反序列化流程

news2024/11/16 19:55:22

前置知识

参考我的另一篇博客,(209条消息) Servlet和SpringMVC_fengwuJ的博客-CSDN博客,描述了Servlet与SpringMVC的关系,大致可以知道从前端请求,到后端接口的中间过程

反序列化流程

  1. 前篇文章中,走到 getMethodParameters--------获取Controller方法形参,并循环依次填充  此步操作时,循环体里会有
    args[i] = this.resolvers.resolveArgument(parameter, mavContainer, request, this.dataBinderFactory);

    该代码用于转换参数,args[i] 对应的是controller方法中参数列表的值

  2. 找到resolver
    this.resolvers.resolveArgument方法中,会调用 this.getArgumentResolver(parameter) 方法来获取具体的resolver,代码如下:
    supportsParameter方法不同的resolver有不同的实现,此处以RequestResponseBodyMethodProcessor为例:
    
    public boolean supportsParameter(MethodParameter parameter) {
            return parameter.hasParameterAnnotation(RequestBody.class);
        }
    
    public boolean supportsReturnType(MethodParameter returnType) {
            return AnnotatedElementUtils.hasAnnotation(returnType.getContainingClass(), ResponseBody.class) || returnType.hasMethodAnnotation(ResponseBody.class);
        }
  3. 使用resolver进行参数解析
  4. 本案例是使用xml作为body参数,所以找到MessageConverter------>MappingJackson2XmlHttpMessageConverter

 

 

5. 最终调用 AbstractJackson2HttpMessageConverter ----> this.objectMapper.readValue(inputMessage.getBody(), javaType);进行参数转化

继续跟进:

ObjectMapper--->

public <T> T readValue(InputStream src, JavaType valueType) throws IOException, JsonParseException, JsonMappingException {
    this._assertNotNull("src", src);
    return this._readMapAndClose(this._jsonFactory.createParser(src), valueType);
}

ObjectMapper---> _readMapAndClose(JsonParser p0, JavaType valueType)

本案例首先获取到的deser为BeanDeserializer,方法如下:

_beanProperties中有_hashArea数组存储有SettableBeanProperty实例,但如何初始化设置的暂时还未找到......
 
SettableBeanProperty 类中包含有_valueDeserializer,初始化信息也未找到

此处进行反序列化操作 

 反序列化操作,从传入JsonParser处初次开始,就是一个递归操作;从JsonParser的首个节点开始,基于javaType类型,找到Deserializer实例,解析,存储,不停递归重复,直到结束

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/563941.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

平台总线模型简介

1. 平台总线介绍 平台总线模型将一个驱动分成两部分 device.c, driver.c。一个描述硬件, 一个控制硬件。 平台总线通过比较字符串, 将name相同的device.c和driver.c匹配到一起来控制硬件。 driver通过平台总线去拿到device.c内容。 平台总线的优点是减少重复代码 提高效率。 …

中间件(三)- Kafka(一)

Kafka 1. Kafka简介1.1 名字由来1.2 主要特性1.3 相关术语1.4 架构图1.5 消息队列1.6 Kafka消费模式1. 一对一消费模式2. 一对多消费模式 1.7 消息中间件 2. Kafka安装及使用2.1 下载kafka2.2 修改配置文件2.3 启动2.4 docker启动 3. 简单指令3.1 topic相关3.2 Kafka 生产/消费…

`JOB`的正确打开方式

文章目录 JOB的正确打开方式 简介工作原理使用场景使用方式注意事项启动JOB失败的情况JOB正确打开方式错误方式正确方式进阶方式终极方式 总结 JOB的正确打开方式 最近有一些小伙伴在使用JOB时&#xff0c;由于使用不当&#xff0c;引起一些问题。例如把license占满&#xff0c…

ASEMI代理长电可控硅MCR100-8特征,MCR100-8应用

编辑-Z 长电可控硅MCR100-8参数&#xff1a; 型号&#xff1a;MCR100-8 VDRM/VRRM&#xff1a;600V IT(RMS)&#xff1a;0.8A 结点温度Tj&#xff1a;-40~125℃ 储存温度Tstg&#xff1a;-55 ~ 150℃ 通态电压VTM&#xff1a;1.7V 栅极触发电压VGT&#xff1a;0.8V 正…

泰克MDO4104C(Tektronix) mdo4104c混合域示波器

泰克 MDO4104C混合域示波器&#xff0c;1 GHz&#xff0c;4 通道&#xff0c;2.5 - 5 GS/s&#xff0c;20 M 点 ​泰克 MDO4104C 示波器是一款 6 合 1 集成示波器&#xff0c;可以配置可选的频谱分析仪、任意波形/函数发生器、逻辑分析仪、协议分析仪和 DVM/频率计数器。当配置…

黑盒测试能发现以下几类错误

黑盒测试能发现以下几类错误 黑盒测试是指在不考虑被测试软件的内部结构和工作原理的情况下&#xff0c;通过输入输出的方式对被测试软件进行测试。它主要关注被测试软件的功能是否达到预期的要求。黑盒测试能够发现以下几类错误。 1. 输入错误&#xff1a;黑盒测试可以检查被测…

如何增加网站权重?有效提高网站权重的技巧方法

权重对于网站优化来说非常的重要&#xff0c;那什么是网站权重呢&#xff1f;网站权重是指搜索引擎给网站&#xff08;包括网页&#xff09;赋予一定的权威值&#xff0c;对网站&#xff08;含网页&#xff09;权威的评估评价。一个网站权重越高&#xff0c;在搜索引擎所占的份…

【C++】虚表和虚基表到底有哪些区别?

虚表和虚基表 虚表虚基表虚拟继承和虚函数都存在时的对象模型 虚表 我们知道&#xff0c;如果类中声明了的方法是用virtual进行修饰的&#xff0c;则说明当前这个方法要作为虚函数&#xff0c;而虚函数的存储和普通函数的存储是有区别的 当有虚函数声明时&#xff0c;编译器会…

运营-16.个性化推荐

个性化推荐 个性化推荐&#xff0c;是根据用户的行为来分析用户的喜好&#xff0c;进而做商品精准推荐。 为什么要做个性化推荐&#xff1f; 1. 收集用户信息&#xff0c;精准获取用户需求&#xff1b; 2. 减少用户搜索商品的页面层级&#xff0c;提高转化率&#xff1b; …

聊聊 Milvus GC:从一次数据丢失事件展开

QueryNode 日志中频繁报错&#xff1f;对象存储数据离奇消失[1]&#xff1f; 令人震惊的数据丢失事件就这样发生了&#xff0c;一位来自 BOSS 直聘的 AI 研发工程师无意卷入到此次的风波中&#xff0c;他和 Milvus 社区的伙伴经过层层排查、抽丝剥茧&#xff0c;成功找出了问题…

还在用 JS 做节流吗?CSS 也可以防止按钮重复点击

目录 一、CSS 实现思路分析 二、CSS 动画的精准控制 三、CSS 实现的其他思路 四、总结一下 众所周知&#xff0c;函数节流&#xff08;throttle&#xff09;是 JS 中一个非常常见的优化手段&#xff0c;可以有效的避免函数过于频繁的执行。 举个例子&#xff1a;一个保存按…

opencv_c++学习(二十)

一、形态学应用案例 开、闭运算、形态学梯度等原理&#xff1a; 相关函数: morphologyEx(InputArray src, OutputArray dst, int op, lnputArray kernel, Point anchor Point(-1,-1), int iterations 1, int borderType BORDER_CONSTANT, const Scalar & border…

Android中静态和动态文字的绘制和测量

Android中静态和动态文字的绘制和测量 Android中自定义视图的时候存在两种情况&#xff0c;静态文字和动态文字。 顾名思义&#xff0c;静态文字就是显示内容是固定的&#xff0c;不会产生变化的文字&#xff0c;而动态文字则是内容会不断产生变化的文字信息。 在说明为什么…

Revit技巧 | Revit中图元不可见怎么办?

在revit中&#xff0c;控制图元课件性的设置有很多种&#xff0c;因此图元不可见&#xff0c;也会有各种各样的原因&#xff0c;这也是经常困扰新手的问题&#xff0c;下面我把这些解决办法做一些归纳总结。 图元如果过远偏离当前视图的中心&#xff0c;将导致视图不可见这时&…

MySQL:数据库的查询与连接

目录 1.复合查询 1.1 多表查询&#xff08;联合查询&#xff09; 1.2 join on (inner join) 1.3 自连接 1.4 子查询 1.5 合并查询 2.内外连接 3.关于高内聚、低耦合 1.复合查询 1.1 多表查询&#xff08;联合查询&#xff09; 什么是多表插叙&#xff1f;实际开发中往…

网络安全管理员证书有什么用?2023证书怎么考?证书报考条件?

网络安全管理员是做什么工作的呢&#xff1f;现如今&#xff0c;网络高速发展&#xff0c;带动了很多行业的兴起&#xff0c;比如说电商行业&#xff0c;今天已经步入到足不出户即可购物的时代了&#xff0c;当然网络也是一把“双刃剑”&#xff0c;带来了好处的同时&#xff0…

Sui Move Object讲解

要了解Sui的独特特性&#xff0c;首先要了解Sui中以对象为中心的数据模型。 Sui的设计初衷是重新定义数字资产所有权的可能性。重新设计的一个基本部分 — — Sui是以对象为中心的数据模型&#xff0c;也是Sui和其他Layer 1区块链之间的一个显著区别。 其他L1如何处理资产所有…

day8 - 使用不同的滤波核进行图像降噪

本期主要介绍用于图像平滑处理的滤波&#xff0c;分别是方框滤波、均值滤波、中值滤波、高斯滤波&#xff0c;比较不同滤波的效果&#xff1b;并了解自定义滤波器进行图像处理。 完成本期内容&#xff0c;你可以&#xff1a; 会使用方框滤波、均值滤波、中值滤波、高斯滤波进行…

实时聊天组合功能,你了解吗?

你有兴趣安装实时聊天组合功能吗&#xff1f;如果您选择了SaleSmartly&#xff08;ss客服&#xff09;&#xff0c;您的实时聊天插件可以不仅仅只是聊天通道&#xff0c;还可以有各种各样的功能&#xff0c;你不需要包含每一个功能&#xff0c;正所谓「宁缺勿滥」&#xff0c;功…

Windows主机中构建适用于K8S Operator开发环境

基于 win 10 打造K8S应用开发环境 一、wsl子系统安装 在cmd命令行终端或powershell中操作 1.1 确认windows操作系统版本 1.2 开启wsl功能 1.3 wsl配置 PS C:\Users\cpf> wsl提示&#xff1a;适用于 Linux 的 Windows 子系统没有已安装的分发版。可以通过访问 Microsoft St…