作者:独坤2602884605 | 来源:互联网 | 2023-07-07 13:05
目录一、POJO封装过程二、原理分析1.执行方法2、封装参数编辑3、初始化编辑4、内置的转换器5、绑定pojo的值6、自定义转换器1、添加自定义converter
目录
一、POJO封装过程
二、原理分析
1.执行方法
2、封装参数
编辑3、 初始化
编辑4、 内置的转换器
5、绑定pojo的值
6、自定义转换器
1、添加自定义converter
2、原理
总结
一、POJO封装过程
代码如下,然后进行测试,看看底层到底是如何封装POJO的
@Data
public class User {private String userName;private Integer age;private Dept dept;
}
@Data
public class Dept {private String deptName;private Integer code;
}
@ResponseBody@PostMapping("/save")public User saveUser( User user){System.out.println(user);return user;}
然后我们直接利用postman的表达提交
二、原理分析
1.执行方法
进入处理器映射器对应的处理器适配器
然后先将27种参数解析器和15种返回结果处理器加入进去
接下来执行handle
117行 执行这个方法
2、封装参数
获取请求参数 --也是我们主要看的,如何将参数自动封装到自定义的pojo中
自定义pojo是通过这个参数解析器进行解析
通过这一步创建一个空的自定义pojo对象
3、 初始化
进入初始化,得到一些转化器
4、 内置的转换器
5、绑定pojo的值
因为是Http文本,有很多格式的问题,因此doBind(mpvs)主要就是要将数据进行转换然后绑定
进入到 setPropertyValues中
遍历属性值,进行设置
设置值 真正的设置
得到age的值 字符串15 然后进行设置
关键在这里
判断是否需要转换
先判断能不能进行转换
成功进入 然后转换
获取一个转换器 要将String 转换为Integer类型的转换器
查找对应的转换器
利用工具进行转换
最终age从String变为 Integer
加载进去
然后每个参数都这样设置即可
WebDataBinder binder = binderFactory.createBinder(webRequest, attribute, name);
WebDataBinder :web数据绑定器,将请求参数的值绑定到指定的JavaBean里面
WebDataBinder 利用它里面的 Converters 将请求数据转成指定的数据类型。再次封装到JavaBean中
GenericConversionService:在设置每一个值的时候,找它里面的所有converter那个可以将这个数据类型(request带来参数的字符串)转换到指定的类型(JavaBean -- Integer)
byte -- > file
6、自定义转换器
如果我们想要进行自定义的类型转换。
例如:我不想使用dept.deptName的方式进行参数的封装
我向使用 一个dept传输 内容用,分割 类似于这样
我们发现这样出现错误:它无法将这个dept中的字符串内容,封装到Dept类中
因此也就出现了我们自定义类型转换器的情况
原理的时候我们发现Converter转换器,是没有一个将String转换为Dept的因此我们要自定义写一个
即在WebMvcConfigurer中添加一个converter
1、添加自定义converter
package com.sofwin.config;import com.sofwin.pojo.Dept;
import com.sofwin.pojo.User;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.converter.Converter;
import org.springframework.format.FormatterRegistry;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;/*** @packageName: com.sofwin.config* @user: wentao* @date: 2022/10/8 14:42* @email 1660420659@qq.com* @description: TODO*/
//声明是一个配置类
@Configuration
//继承WebMvcConfigurer
public class MvcConfig implements WebMvcConfigurer {//实现addFormattrs@Overridepublic void addFormatters(FormatterRegistry registry) {//在类型转换的注册中加入一个自定义Converterregistry.addConverter(new Converter() {@Overridepublic Dept convert(String source) {if (!StringUtils.isEmpty(source)){String[] split = source.split(",");Dept dept =new Dept();dept.setDeptName(split[0]);dept.setCode(Integer.parseInt(split[1]));return dept;}return null;}});}
}
加入过后访问就成功了
2、原理
我们打一个断点,看一看Converter是否加入,然后在看一看自定义的Converter是否执行即可
从124到125多了一个 就是这个我们自定义的String转换为Dept的转化器
最终会进入到我们写的这个自定义转化器将带,分割的字符串装换为Dept
总结
这个大概的原理就是这样,其实还是要自己进行debug走一走,效果能好一点,这里包含了很多的设计模式,多看源码对我们的编程是很有帮助的,Spring的源码,行业上是非常认可的