当前位置:网站首页>八、请求处理之自定义类型参数绑定原理
八、请求处理之自定义类型参数绑定原理
2022-08-05 05:16:00 【呆比特】
请求处理之自定义类型参数绑定原理
这篇我们学习自定义参数绑定的原理,同样,先来做一个测试,有如下一个表单,表单对应下边两个类的属性,发送 saveuser 请求测试一下
/** * 姓名: <input name="userName"/> <br/> * 年龄: <input name="age"/> <br/> * 生日: <input name="birth"/> <br/> * 宠物姓名:<input name="pet.name"/><br/> * 宠物年龄:<input name="pet.age"/> */
@Data
public class Person {
private String userName;
private Integer age;
private Date birth;
private Pet pet;
}
@Data
public class Pet {
private String name;
private String age;
}
/** * 数据绑定:页面提交的请求数据(GET、POST)都可以和对象属性进行绑定 * @param person * @return */
@PostMapping("/saveuser")
public Person saveuser(Person person){
return person;
}
可以看到,我们提交的数据和对象自动就绑定包装好了
接下来,我们就是来探索它的原理是什么,走起…
照样前边分析过的不在赘述,直接看它获取的是哪个参数解析器
在 HandlerMethodArgumentResolverComposite.class 的 getArgumentResolver 方法,debug发现它拿到的是 ServletModelAttributeMethodProcessor ,也就是说,自定义类型的参数,我们用这个处理器
拿到了参数解析器,我们来看它如何处理
step into 来到 ModelAttributeMethodProcessor.class 的 resolveArgument 方法,前边一系列判断之后,调用了 createAttribute() 方法,这个方法为我们创建了一个空Person对象
然后就是进行绑定,利用 WebDataBinder 将请求中的所有数据,绑定到指定的JavaBean里边
WebDataBinder 利用它里面的 Converters 将请求数据转成指定的数据类型。然后封装到JavaBean中
在 bindRequestParameters 方法中,利用反射,获取我们请求里边的每一个参数值,然后找到我们JavaBean中的属性,将值封装到属性里边
进入bind()方法
进入doBind()方法
用我们的属性值
省略中间一些包装,到下边方法里边,就行转换器转换
用我们的转换器 Converter 转换好后,最后设置到JavaBean属性中,这就是们自定义类型参数绑定原理
如果你想要将传来的字符串,按照你的方式转换,也可以定制化 Converter , 方法就是给容器中放入自己的 WebMvcConfigurer ,重写里边的 addFormatters 方法,在里边添加自己的 Converter规则,快去试试吧!
边栏推荐
猜你喜欢
记我的第一篇CCF-A会议论文|在经历六次被拒之后,我的论文终于中啦,耶!
You should write like this
【Kaggle项目实战记录】一个图片分类项目的步骤和思路分享——以树叶分类为例(用Pytorch)
Mysql-连接https域名的Mysql数据源踩的坑
CVPR best paper winner Huang Gao's team from Tsinghua University presented the first dynamic network review
Detailed explanation of BroadCast Receiver (broadcast)
网络ID,广播地址,掩码位数计算
PoE视频监控解决方案
CAN、CAN FD
Thread handler handle IntentServvice handlerThread
随机推荐
【零基础开发NFT智能合约】如何使用工具自动生成NFT智能合约带白名单可Mint无需写代码
解决:Unknown column ‘id‘ in ‘where clause‘ 问题
【论文精读】Rich Feature Hierarchies for Accurate Object Detection and Semantic Segmentation(R-CNN)
MaskDistill-不需要标注数据的语义分割
SQL (2) - join window function view
CVPR best paper winner Huang Gao's team from Tsinghua University presented the first dynamic network review
You should write like this
常见的 PoE 错误和解决方案
TinyFlashDB:一种超轻量的可纠错的通用单片机flash存储方案
Spark ML学习相关资料整理
【22李宏毅机器学习】课程大纲概述
【ts】typescript高阶:联合类型与交叉类型
【Kaggle项目实战记录】一个图片分类项目的步骤和思路分享——以树叶分类为例(用Pytorch)
大型Web网站高并发架构方案
spingboot 容器项目完成CICD部署
[Pytorch study notes] 11. Take a subset of the Dataset and shuffle the order of the Dataset (using Subset, random_split)
flink实例开发-详细使用指南
C语言联合体union占用空间大小问题
ES6 新特性:Class 的继承
【ts】typescript高阶:模版字面量类型