Spring使用Converter转换器进行源类型对象到目标类型对象的转换。而Formatter完成任意类型对象(Object)与String之间的类型转换,也即是格式化和解析。Formatter可以将String转换成Java类型,例如用于表单中的用户输入。
ConversionService组件进行数据类型转换、数据格式化工作。它是Spring类型转换体系的核心接口。ConversionServiceFactoryBean中可以内置很多的类型转换器,如果需要自定义类型转换器,可以在ConversionServiceFactoryBean中定义convertes属性。
//class具体路径部分有所省略
<bean id="conversionService" class=".ConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class=".StringToDateConverter"/>
</list>
</property>
</bean>
在《Spring MVC中的信息转换(学习笔记)》一文中,讲到了HttpMessageConvert<T>是Spring3.0之后新增的一个重要接口,它负责将请求信息转换为一个对象(类型为T),并将对象绑定到请求方法的参数中或输出为响应信息。
而MappingJackson2HttpMessageConverter(针对JSON的一种信息转换器,实现了HttpMessageConvert接口)可以处理JSON格式的请求或者响应信息。
这里有讲到Spring在org.springframework.core.convert.convert中定义了3种类型的转换器接口:Converter
、ConverterFactory
、GenericConverter
。
此外,还可以使用@InitBinder添加自定义编辑器。
需要用一个类实现PropertyEditor接口,一般可以通过继承PropertyEditorSupport,然后再在Controller文件中通过注解来初始化注册属性编辑器。
@InitBinder
public void InitBinder(WebDataBinder binder){
// 注册自定义编辑器,其中DataEditor是自定义的编辑器类
inder.registerCustomEditor(Date.class,new DateEditor());
}
还有一种方法是使用WebBindingInitializer注册全局自定义编辑器来转换数据。这时候的配置方法跟配置HttpMessageConverter有点像,是在AnnotationMethodHandlerAdapter
中进行配置。
<!-- 通过AnnotationMethodHandlerAdapter装配自定义编辑器 -->
<bean
class=".AnnotationMethodHandlerAdapter">
<property name="webBindingInitializer">
<bean class=".DateBindingInitializer" />
</property>
</bean>
多种转换器的优先顺序
1、查询通过@InitBinder装配的自定义编辑器。
2、查询通过ConversionService装配的自定义编辑器。
3、查询通过WebBindingInitializer接口装配的全局自定义编辑器。