从原理层面掌握@InitBinder的使用【享学Spring MVC】
每篇一句
大魔王张怡宁:女儿,这堆金牌你拿去玩吧,但我的银牌不能给你玩。你要想玩银牌就去找你王浩叔叔吧,他那银牌多
前言
为了讲述好Spring MVC
最为复杂的数据绑定这块,我前面可谓是做足了功课,对此部分知识此处给小伙伴留一个学习入口,有兴趣可以点开看看:聊聊Spring中的数据绑定 --- WebDataBinder、ServletRequestDataBinder、WebBindingInitializer...【享学Spring】
@InitBinder
这个注解是Spring 2.5
后推出来,用于数据绑定、设置数据转换器等,字面意思是“初始化绑定器”。
关于数据绑定器的概念,前面的功课中有重点详细讲解,此处默认小伙伴是熟悉了的~
在Spring MVC
的web项目中,相信小伙伴们经常会遇到一些前端给后端传值比较棘手的问题:比如最经典的问题:
Date
类型(或者LocalDate类型
)前端如何传?后端可以用Date
类型接收吗?- 字符串类型,如何保证前段传入的值两端没有空格呢?(99.99%的情况下多余的空格都是木有用的)
对于这些看似不太好弄的问题,看了这篇文章你就可以优雅的搞定了~
---
说明:关于Date
类型的传递,业界也有两个通用的解决方案:
- 使用时间戳
- 使用
String
字符串(传值的万能方案)
使用者两种方式总感觉不优雅,且不够面向对象。那么本文就介绍一个黑科技:使用@InitBinder
来便捷的实现各种数据类型的数据绑定(咱们Java是强类型语言且面向对象的,如果啥都用字符串,是不是也太low了~)
> 一般的string, int, long会自动绑定到参数,但是自定义的格式spring就不知道如何绑定了 .所以要继承PropertyEditorSupport
,实现自己的属性编辑器PropertyEditor
,绑定到WebDataBinder ( binder.registerCustomEditor)
,覆盖方法setAsText
@InitBinder
原理
本文先原理,再案例的方式,让你能够彻头彻尾的掌握到该注解的使用。
1、@InitBinder
是什么时候生效的?
这就是前面文章埋下的伏笔:Spring
在绑定请求参数到HandlerMethod
的时候(此处以RequestParamMethodArgumentResolver
为例),会借助WebDataBinder
进行数据转换:
// RequestParamMethodArgumentResolver的父类就是它,resolveArgument方法在父类上 // 子类仅仅只需要实现抽象方法resolveName,即:从request里根据name拿值 AbstractNamedValueMethodArgumentResolver: @Override @Nullable public final Object resolveArgument( ... ) { ... Object arg = resolveName(resolvedName.toString(), nestedParameter, webRequest); ... if (binderFactory != null) { // 创建出一个WebDataBinder WebDataBinder binder = binderFactory.createBinder(webRequest, null, namedValueInfo.name); // 完成数据转换(比如String转Date、String转...等等) arg = binder.convertIfNecessary(arg, parameter.getParameterType(), parameter); ... } ... return arg; }
它从请求request拿值得方法便是:request.getParameterValues(name)
。