每篇一句

大魔王张怡宁:女儿,这堆金牌你拿去玩吧,但我的银牌不能给你玩。你要想玩银牌就去找你王浩叔叔吧,他那银牌多

前言

为了讲述好Spring MVC最为复杂的数据绑定这块,我前面可谓是做足了功课,对此部分知识此处给小伙伴留一个学习入口,有兴趣可以点开看看:聊聊Spring中的数据绑定 --- WebDataBinder、ServletRequestDataBinder、WebBindingInitializer...【享学Spring】

@InitBinder这个注解是Spring 2.5后推出来,用于数据绑定、设置数据转换器等,字面意思是“初始化绑定器”。

关于数据绑定器的概念,前面的功课中有重点详细讲解,此处默认小伙伴是熟悉了的~

Spring MVC的web项目中,相信小伙伴们经常会遇到一些前端给后端传值比较棘手的问题:比如最经典的问题:

  • Date类型(或者LocalDate类型)前端如何传?后端可以用Date类型接收吗?
  • 字符串类型,如何保证前段传入的值两端没有空格呢?(99.99%的情况下多余的空格都是木有用的)

对于这些看似不太好弄的问题,看了这篇文章你就可以优雅的搞定了~

---

说明:关于Date类型的传递,业界也有两个通用的解决方案

  1. 使用时间戳
  2. 使用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)