SpringBoot核心技术篇-web开发2-自定义pojo参数的封装和自定义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
    @Override
    public void addFormatters(FormatterRegistry registry) {
        //在类型转换的注册中加入一个自定义Converter
        registry.addConverter(new Converter<String, Dept>() {
            @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;
            }
        });
    }
}

加入过后访问就成功了

 


2、原理

我们打一个断点,看一看Converter是否加入,然后在看一看自定义的Converter是否执行即可

 

从124到125多了一个  就是这个我们自定义的String转换为Dept的转化器

 最终会进入到我们写的这个自定义转化器将带,分割的字符串装换为Dept

 

 总结

这个大概的原理就是这样,其实还是要自己进行debug走一走,效果能好一点,这里包含了很多的设计模式,多看源码对我们的编程是很有帮助的,Spring的源码,行业上是非常认可的

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值