sss继 《SpringBoot:参数处理原理 ---- 8.2》和SpringBoot:参数处理原理 (复杂参数)---- 8.3(图解)这两篇文章,我们分析一下自定义参数在请求过程中的不同的细节。
- 自定义对象参数:
- POJO封装过程
- 转换过程
- 自定义转换器
自定义对象参数:
sss可以自动类型转换与格式化,可以级联封装:
/**
* 姓名: <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;
}
@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中包含了原来的参数对象,则我们直接取出来使用,而不用重新创建。否则会创建一个空对象。
sss接下来,将requet中的数据全都绑定到这个对象中:
sss以上两步都在一个方法,整体步骤如下:
sss【注】:
sdsdsssWebDataBinder binder = binderFactory.createBinder(webRequest, attribute, name);
ssdsdssWebDataBinder :web数据绑定器,将请求参数的值绑定到指定的JavaBean里面
sdsdsssWebDataBinder 利用它里面的 Converters 将请求数据转成指定的数据类型。再次封装到JavaBean中。
sdsdsdsss因为我们通过request传过来的数据是利用Http协议传输的,是以文本的形式进行传输,所以我们需要对其进行转换成相应的数据类型,然后利用反射,将其绑定到对象中。
@FunctionalInterfacepublic interface Converter<S, T> 总接口
sdss
转换过程
sssGenericConversionService:在设置每一个值的时候,找它里面的所有converter,让其可以将这个数据类型(request带来参数的字符串,一般是string,如果是文件上传,就是流的形式)转换到指定的类型,比如:JavaBean – Integer,byte – > file
sdsdsdsss
sss未来我们可以给WebDataBinder里面放自己的Converter;
ssdsdsdsprivate static final class StringToNumber implements Converter<String, T>
自定义转换器
ssdsdsdssdsdsd