完成自定义转换器需要实现以下三个中的任意一个接口:<code>convertor<s,t></code>、genericconvertor或convertorfacoty。下面我们对这些接口进行逐一分析:
这是最为简单的一个接口,定义了从源类到目标类的转换方法。该接口的定义如下
genericconvertor会根据源类对象及目标类对象所在宿主类的上下文信息进行类型转换工作,该接口的定义如下:
我们常使用其实现类接口:
它除了实现genericconverter,还实现了另一个“条件转换器”:
在实际开发中,我们能实现此接口自定义转换器,来根据具体类型上下文来灵活配置我们的类型转换
这是一个将我们源类转换为一个目标类或其子类的”多转换器共存“接口工厂。它的定义如下:
这个接口一个常见的实现类是stringtonumberconvertor,能将string类型数据转换为number类型或其子类:long,integer,double等。
conversionservice则是spring类型转换体系的核心接口,conversionservice接口的定义如下:
实现以上类型完成我们的自定义转换器定义后,我们还要在spring容器中通过conversionservicefactorybean注册创建后才能使用。
conversionservicefactorybean创建了我们的conversionservice很多内置转换器,利用这些转换器,我们可以完成大部分常见的类型转换工作
而如果我们想使用自定义的类型转换器,可以通过conversionservicefactorybean的convertor属性来注册。
通过以上的分析,我们接下来尝试自定实现convert
在控制层,我们通过以下方法测试我们的转换器
启动服务器,在游览器中访问[项目根路径]/convert?user=11,myusername,mypassword。
控制台会打印信息:user [id=11, username=myusername, password=mypassword]。即springmvc帮我们完成了字符串到user类型的转换。**这里需注意的是,我们的请求参数名”user”是和控制层方法入参变量user user像对应的,才能完成参数绑定进而转换类型
在实例1的基础上,我们添加user的一个子类:superuser,作为”super”子类,它拥有了自己的专属名字,我们将字符串”11,myusername,mypassword,myname“转换为我们的superuser对象,下面相对应的自定义转换器和pojo类
除了配置上面的转换器,还需自定义我们的转换器工厂,在转换器工厂中,我们根据目标类型是user还是其子类superuser来调用相应的自定义转换器:
在实例1的基础上,我们添加一个新方法
运行服务器,我们在游览器中输入:
1. root/convert?user=10,myusername,mypassword
控制台输出:user [id=10, username=myusername, password=mypassword]
2. root/convertsuper?superuser=11,myusername,mypassword,myname
控制台输出:superuser [name=myname, tostring()=user [id=11, username=myusername, password=mypassword]]
我们根据入参类型,并通过convertfactory,完成对同一系列(某一类及其子类)的类型转换