6.2.1 ConversionService
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 | 此处有代码后面补上 |