6.2 数据转换
在Java
语言中,在java.beans
包中提供了一个ProperyEditor
接口来进行数据转换。ProperyEditor
的核心功能是将一个字符串转换为一个Java
对象,以便根据界面的输入或配置文件中的配置字符串构造出一个Java
对象。但是ProperyEditor
存在以下不足:
只能用于字符串和Java
对象的转换,不适用于任意两个Java
类型直接的转换。
对源对象及目标对象所在的上下文信息(如注解等)不敏感,在类型转换时不能利用这些上下文信息实施高级转换逻辑。
6.2.1 ConversionService
Spring
从3.0开始,添加了一个通用的类型转换模块,该类型转换模块位于org.springframework.core.convert
包中。Spring
希望用这个类型转换体系替换Java
标准的ProperyEditor
接口。但是由于历史原因,Spring
还是同时支持两者。我们可以在SpringMVC
处理方法的参数绑定中使用它们进行数据转换。org.springframework.core.convert.ConversionService
是Spring
类型转换体系的核心接口,在该接口中定义了以下4个方法:
方法 | 描述 |
---|---|
boolean canConvert(Class<?> sourceType,Class<?> targetType) |
判断是否可以将一个Java 类转换为另一个Java 类。 |
boolean canConvert(TypeDescriptor sourceType,TypeDescriptor targetType) |
需要转换的类将以成员变量的方式出现,TypeDescriptor 不但描述了需要转换类的信息,还描述了类的上下文信息,例如成员变量上的注解成员变量是否以数组、集合或Map 的方式呈现等。类型转换逻辑可以利用这些信息做出各种灵活的控制。 |
<T>T convert(Object source,Class<T> targetType) |
将源类型对象转换为目标类型对象。 |
Object convert(Object source ,TypeDescriptor sourceType,TypeDescriptor targetType) |
将对象从源类型对象转换为目标类型对象,通常会利用到类中的上下文信息。 |
在Spring配置文件中配置
可以利用org.springframework.context.support.ConversionServiceFactoryBean
在Spring
的上下文中定义一个ConversionService
。Spring
将自动识别出上下文中的ConversionService
,并在SpringMVC
处理方法的参数绑定中使用它进行数据转换。示例配置代码如下:
1 | 此处有代码后面补上 |
默认支持转换类型
在ConversionServiceFactoryBean
中可以内置很多的类型转换器,使用它们可以完成大多数Java
类型的转换工作,其除了包括将Spring
对象转换为各种基础类型的对象外,还包括String
、Number
、Array
、Collection
、Map
、Properties
及Object
之间的转换器。
注册自定义的类型转换器
可以通过ConversionServiceFactoryBean
的converters
属性注册自定义的类型转换器,示例配置代码如下:
1 | 此处有代码后面补上 |