请求处理之自定义类型参数绑定原理
这篇我们学习自定义参数绑定的原理,同样,先来做一个测试,有如下一个表单,表单对应下边两个类的属性,发送 saveuser 请求测试一下
/**
* 姓名: <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;
}
/**
* 数据绑定:页面提交的请求数据(GET、POST)都可以和对象属性进行绑定
* @param person
* @return
*/
@PostMapping("/saveuser")
public Person saveuser(Person person){
return person;
}
可以看到,我们提交的数据和对象自动就绑定包装好了
接下来,我们就是来探索它的原理是什么,走起…
照样前边分析过的不在赘述,直接看它获取的是哪个参数解析器
在 HandlerMethodArgumentResolverComposite.class 的 getArgumentResolver 方法,debug发现它拿到的是 ServletModelAttributeMethodProcessor ,也就是说,自定义类型的参数,我们用这个处理器
拿到了参数解析器,我们来看它如何处理
step into 来到 ModelAttributeMethodProcessor.class 的 resolveArgument 方法,前边一系列判断之后,调用了 createAttribute() 方法,这个方法为我们创建了一个空Person对象
然后就是进行绑定,利用 WebDataBinder 将请求中的所有数据,绑定到指定的JavaBean里边
WebDataBinder 利用它里面的 Converters 将请求数据转成指定的数据类型。然后封装到JavaBean中
在 bindRequestParameters 方法中,利用反射,获取我们请求里边的每一个参数值,然后找到我们JavaBean中的属性,将值封装到属性里边
进入bind()方法
进入doBind()方法
用我们的属性值
省略中间一些包装,到下边方法里边,就行转换器转换
用我们的转换器 Converter 转换好后,最后设置到JavaBean属性中,这就是们自定义类型参数绑定原理
如果你想要将传来的字符串,按照你的方式转换,也可以定制化 Converter , 方法就是给容器中放入自己的 WebMvcConfigurer ,重写里边的 addFormatters 方法,在里边添加自己的 Converter规则,快去试试吧!