SpringBoot:参数处理原理 (自定义参数,主要是参数转换)---- 8.4

sss继 《SpringBoot:参数处理原理 ---- 8.2》和SpringBoot:参数处理原理 (复杂参数)---- 8.3(图解)这两篇文章,我们分析一下自定义参数在请求过程中的不同的细节。

      • 自定义对象参数:
        • POJO封装过程
        • 转换过程
        • 自定义转换器

自定义对象参数:

sss可以自动类型转换与格式化,可以级联封装:

/**
 *     姓名:  
* 年龄:
* 生日:
* 宠物姓名:
* 宠物年龄: */
@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; }
    @PostMapping("/saveuser")
    public Person saveuser(Person person){
     

        return person;
    }

sss结果:

sdsdsdss{“userName”:“zhangsan”,“age”:18,“birth”:“2019-12-09T16:00:00.000+00:00”,“pet”:{“name”:“阿猫”,“age”:5}}

sss可以自动类型转换与格式化,可以级联封装。

POJO封装过程

sss● ServletModelAttributeMethodProcessor 这个参数处理(解析)器支持对自定义类型参数解析。它首先判断其是否含有注解,并且是否是简单类型:

public static boolean isSimpleValueType(Class<?> type) {
     
		return (Void.class != type && void.class != type &&
				(ClassUtils.isPrimitiveOrWrapper(type) ||
				Enum.class.isAssignableFrom(type) ||
				CharSequence.class.isAssignableFrom(type) ||
				Number.class.isAssignableFrom(type) ||
				Date.class.isAssignableFrom(type) ||
				Temporal.class.isAssignableFrom(type) ||
				URI.class == type ||
				URL.class == type ||
				Locale.class == type ||
				Class.class == type));
	}

sss● 在对参数进行解析时,如果mavContaioner中包含了原来的参数对象,则我们直接取出来使用,而不用重新创建。否则会创建一个空对象。
SpringBoot:参数处理原理 (自定义参数,主要是参数转换)---- 8.4_第1张图片
sss接下来,将requet中的数据全都绑定到这个对象中:
在这里插入图片描述
sss以上两步都在一个方法,整体步骤如下:
SpringBoot:参数处理原理 (自定义参数,主要是参数转换)---- 8.4_第2张图片
sss【注】:

sdsdsssWebDataBinder binder = binderFactory.createBinder(webRequest, attribute, name);

ssdsdssWebDataBinder :web数据绑定器,将请求参数的值绑定到指定的JavaBean里面

sdsdsssWebDataBinder 利用它里面的 Converters 将请求数据转成指定的数据类型。再次封装到JavaBean中。

sdsdsdsss因为我们通过request传过来的数据是利用Http协议传输的,是以文本的形式进行传输,所以我们需要对其进行转换成相应的数据类型,然后利用反射,将其绑定到对象中。

@FunctionalInterfacepublic interface Converter 总接口
sdssSpringBoot:参数处理原理 (自定义参数,主要是参数转换)---- 8.4_第3张图片

转换过程

sssGenericConversionService:在设置每一个值的时候,找它里面的所有converter,让其可以将这个数据类型(request带来参数的字符串,一般是string,如果是文件上传,就是流的形式)转换到指定的类型,比如:JavaBean – Integer,byte – > file
sdsdsdsssSpringBoot:参数处理原理 (自定义参数,主要是参数转换)---- 8.4_第4张图片
sss未来我们可以给WebDataBinder里面放自己的Converter;

ssdsdsdsprivate static final class StringToNumber implements Converter

自定义转换器

ssdsdsdssdsdsdSpringBoot:参数处理原理 (自定义参数,主要是参数转换)---- 8.4_第5张图片

你可能感兴趣的:(SpringBoot,spring,boot,java,后端)