原文网址:https://knife.blog.csdn.net/article/details/125528337
简介
本文介绍@InitBinder的用法与原理。
使用
见:SpringBoot--全局格式处理--方法/实例_IT利刃出鞘的博客-CSDN博客
原理
加了前缀为何能绑定上
1、ModelAttributeMethodProcessor#resolveArgument里依赖attribute = createAttribute(name, parameter, binderFactory, webRequest)方法完成数据的封装、转换
2、createAttribute先request.getParameter(attributeName)看请求域里是否有值(此处为null),若木有就反射创建一个空实例,回到resolveArgument方法。
3、继续利用WebDataBinder来完成对这个空对象的数据值绑定,这个时候这些FieldDefaultPrefix就起作用了。执行方法是:bindRequestParameters(binder, webRequest),实际上是((WebRequestDataBinder) binder).bind(request);。对于bind方法的原理,就不陌生了~
4、完成Model数据的封装后,再进行@Valid校验...
总结
- @InitBinder标注的方法执行是多次的,一次请求来就执行一次
- Controller实例中的所有@InitBinder只对当前所在的Controller有效
- @InitBinder的value属性控制的是模型Model里的key,而不是方法名(不写代表对所有的生效)
- @InitBinder标注的方法不能有返回值(只能是void或者returnValue=null)
- @InitBinder对@RequestBody这种基于消息转换器的请求参数无效
因为@InitBinder它用于初始化DataBinder数据绑定、类型转换等功能,而@RequestBody它的数据解析、转换时消息转换器来完成的,所以即使你自定义了属性编辑器,对它是不生效的(它的WebDataBinder只用于数据校验,不用于数据绑定和数据转换。它的数据绑定转换若是json,一般都是交给了jackson来完成的)。
只有AbstractNamedValueMethodArgumentResolver才会调用binder.convertIfNecessary进行数据转换,从而属性编辑器才会生效