SpringBoot--@InitBinder--使用/原理

原文网址: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校验...

总结

  1. @InitBinder标注的方法执行是多次的,一次请求来就执行一次
  2. Controller实例中的所有@InitBinder只对当前所在的Controller有效
  3. @InitBinder的value属性控制的是模型Model里的key,而不是方法名(不写代表对所有的生效)
  4. @InitBinder标注的方法不能有返回值(只能是void或者returnValue=null)
  5. @InitBinder对@RequestBody这种基于消息转换器的请求参数无效

        因为@InitBinder它用于初始化DataBinder数据绑定、类型转换等功能,而@RequestBody它的数据解析、转换时消息转换器来完成的,所以即使你自定义了属性编辑器,对它是不生效的(它的WebDataBinder只用于数据校验,不用于数据绑定和数据转换。它的数据绑定转换若是json,一般都是交给了jackson来完成的)。

        只有AbstractNamedValueMethodArgumentResolver才会调用binder.convertIfNecessary进行数据转换,从而属性编辑器才会生效

猜你喜欢

转载自blog.csdn.net/feiying0canglang/article/details/125528337