目录
一、POJO封装过程
二、原理分析
1.执行方法
2、封装参数
编辑3、 初始化
编辑4、 内置的转换器
5、绑定pojo的值
6、自定义转换器
1、添加自定义converter
2、原理
总结
代码如下,然后进行测试,看看底层到底是如何封装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的表达提交
进入处理器映射器对应的处理器适配器
接下来执行handle
获取请求参数 --也是我们主要看的,如何将参数自动封装到自定义的pojo中
自定义pojo是通过这个参数解析器进行解析
通过这一步创建一个空的自定义pojo对象
进入初始化,得到一些转化器
因为是Http文本,有很多格式的问题,因此doBind(mpvs)主要就是要将数据进行转换然后绑定
进入到 setPropertyValues中
关键在这里
成功进入 然后转换
获取一个转换器 要将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
如果我们想要进行自定义的类型转换。
例如:我不想使用dept.deptName的方式进行参数的封装
我向使用 一个dept传输 内容用,分割 类似于这样
我们发现这样出现错误:它无法将这个dept中的字符串内容,封装到Dept类中
因此也就出现了我们自定义类型转换器的情况
原理的时候我们发现Converter转换器,是没有一个将String转换为Dept的因此我们要自定义写一个
即在WebMvcConfigurer中添加一个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 [email protected]
* @description: TODO
*/
//声明是一个配置类
@Configuration
//继承WebMvcConfigurer
public class MvcConfig implements WebMvcConfigurer {
//实现addFormattrs
@Override
public void addFormatters(FormatterRegistry registry) {
//在类型转换的注册中加入一个自定义Converter
registry.addConverter(new Converter() {
@Override
public 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;
}
});
}
}
加入过后访问就成功了
我们打一个断点,看一看Converter是否加入,然后在看一看自定义的Converter是否执行即可
从124到125多了一个 就是这个我们自定义的String转换为Dept的转化器
最终会进入到我们写的这个自定义转化器将带,分割的字符串装换为Dept
这个大概的原理就是这样,其实还是要自己进行debug走一走,效果能好一点,这里包含了很多的设计模式,多看源码对我们的编程是很有帮助的,Spring的源码,行业上是非常认可的