在JAVA语言中,在java.beans包中提供了一个ProperyEditor接口来进行数据转换.ProperyEditor的核心功能是将一个字符串转换为一个Java对象,以便根据界面的输入或配置文件中的配置字符串构造出一个Java对象.
但是ProperyEditor存在以下不足:
(1)只能用于字符串和Java对象的转换,不适用任意两个Java类型直接的转换.
(2)对源对象及目标对象所在的上下文信息(如注释等)不敏感,在类型转换时不能利用这些上下文信息实施高级转换逻辑.
Spring从3.0开始,添加了一个通用的类型转换模块,该类型转换模块位于org.springframework.core.convert包中.Spring希望用这个类型转换体系替换Java标准的ProperyEditor接口.但是由于历史原因.Spring还是同时支持两者.我们可以在SpringMVC处理方法的参数绑定中使用他们进行数据转换.
1.ConversionService
org.springframework.core.convert.ConversionService是Spring类型转换体系的核心接口,在该接口定义了以下4个方法:
boolean canConvert(Class<?>sourceType,Class<?>targetType):
判断是否可以将一个Java类转换为另一个Java类.
boolean canConvert(TypeDescriptor sourceType,TypeDescriptortargetType):
需要转换的类将以成员变量的方式出现,TypeDescriptor不但描述了需要转换类的信息,还描述了类的上下文信息,例如成员变量上的注释成员变量是否已数组,集合或Map的方式呈现等.类型转换逻辑可以利用这些信息做出各种灵活的控制.
<T>T conver(Object source,Class<T> targetType):
将源类型对象转换为目标类型对象
Object Convert(Object source,TypeDescriptor sourceType,TypeDescriptor targetType):
将对象从源类型对象转换为目标类型对象,通常会利用到类中的上下文信息.可以利用org.springframework.context.support.ConversionServiceFactroyBean在Spring的上下文定义一个ConversionService.Spring将自动识别出上下文中的ConversionService,并在SpringMVC处理方法的参数绑定中使用他进行数据转换.
示例配置代码如下:
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean" />
在ConversionServiceFactoryBean中可以内置很多的类型转换器,使用他们可以完成大多数Java类型的转换工作.其除了包括将Spring对象转换为各种基础类型对象之外,还包络String,Number,Array,Collection,Map,Properties及Object之间的转换器.
可以通过ConversionServiceFactoryBean的converters属性注册自定义的类型转换器,示例配置代码如下:
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"> <property name="converters"> <list> <bean class="org.fkit.converter.StringToDateConverter" /> </list> </property> </bean>
2.Spring支持的转换器
Spring在org.springframework.core.convert.converter包中定义了3中类型的转行器接口,我们可以实现其中任意一种转换器接口,并将他做为自定义转换器注册到ConversionServiceFactoryBean当中,这3种类型转换器接口如下所示:
Converter<S,T>:
Conve0072ter<S,T>接口是spring中最简单的一个转换器接口,该接口中只有一个方法,T consert(s source)该方法负责将S类型的对象转换为T类型对象.
ConserterFactory<S,R>:
如果希望将一种类型的对象转换为另一种类型及其子类对象,比如将String转换为Number以及Number的子类Integer,Doube等对象,就需要一系列的Converter,如StringToInteger,StringToDouble等.ConvertFactory<S,R>接口的作用就是将相同系列多个Converter封装在一起.该接口中也只有一个方法:
<T extends R> Converter<S,T> getConverter(Class<T> targetType)
S为转换的源类型,R为目标类型的基类,T为R的子类
GenericConverter
Converter<S,T>接口只是负责将一个类型对象转换为另一个类型的对象,他并没有考虑类型对象上下文信息,因此并不能完成”复杂”类型转换工作.GenericConverter接口会根据源类对象及目标类型的上下文信息进行类型转换.该接口中定义了两个方法:
Set<GenericConverter.ConvertiblePair> getConvertibleType()
Object convert(Object source,TypeDescriptor sourceType,TypeDescriptor targetType)
ConvertiblePair封装了源类型和目标类型,而TypeDescriptor包含了需要转换的类型对象上下文信息,因此GenericConverter接口的convert()方法可以利用这些上下文信息进行类型转换工作.