当前位置:网站首页>八、请求处理之自定义类型参数绑定原理
八、请求处理之自定义类型参数绑定原理
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规则,快去试试吧!
边栏推荐
猜你喜欢
随机推荐
基于Flink CDC实现实时数据采集(四)-Sink接口实现
【论文阅读-表情捕捉】High-quality Real Time Facial Capture Based on Single Camera
MSRA proposes extreme masking model ExtreMA for learning instances and distributed visual representations
flink项目开发-flink的scala shell命令行交互模式开发
C语言联合体union占用空间大小问题
Thread handler句柄 IntentServvice handlerThread
基于Flink CDC实现实时数据采集(二)-Source接口实现
ECCV2022 | RU & Google propose zero-shot object detection with CLIP!
flink项目开发-配置jar依赖,连接器,类库
ES6 新特性:Class 的继承
【22李宏毅机器学习】课程大纲概述
SQL(1) - Add, delete, modify and search
MSRA提出学习实例和分布式视觉表示的极端掩蔽模型ExtreMA
CVPR2021 - Inception Convolution with Efficient Dilation Search
关于基于若依框架的路由跳转
【shell编程】第二章:条件测试语句
【Pytorch学习笔记】11.取Dataset的子集、给Dataset打乱顺序的方法(使用Subset、random_split)
【论文精读】R-CNN 之预测框回归(Bounding box regression)问题详述
Day1:用原生JS把你的设备变成一台架子鼓!
MaskDistill-不需要标注数据的语义分割