基于Spring MVC数据类型转换的学习笔记总结
问题
页面中数据格式为字符串格式,后台pojo中对应的类型可能为另外一种对象。
如: 在前台页面输入一个固定格式的时间字符串,在后台接收为一个java.util.Date类型的对象。
1. 实现Converter接口
创建自己的Converter(EmployeeConverter),实现org.springframework.core.convert.converter.Converter<S, T>接口。
S表示源对象类型:String
T表示目标对象类型: Employee
2. 添加到SpringMVC的配置文件
配置ConversionService:
<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
<!-- conversionService必须要注入到<mvc:annotation-driven>中 -->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<!-- 就是1中自己实现的converter对象 -->
<ref bean="employeeConverter" />
</set>
</property>
</bean>
3. 数据校验
可以在自己实现的converter中实现数据校验的功能
数据绑定流程
- Spring MVC主框架将ServletRequest对象及目标方法的入参实例传递给 WebDataBinderFactory 实例,以创建 DataBinder 实例对象。
- DataBinder 调用装配在Spring MVC上下文中的 ConversionService 组件进行数据类型转换、数据格式化工作。将Servlet中的请求信息填充到入参对象中。
- 调用 Validator 组件对已经绑定了请求消息的入参对象进行数据合法性校验,并最终生成数据绑定结果 BindingData 对象。
- Spring MVC抽取 BindingResult 中的入参对象和校验错误对象,将它们付给处理方法的相应入参。
Spring MVC上下文中内建了很多转换器,可完成大多数java类型的转换工作。一般类型的转换不需要进行特殊的配置。
自定义类型转换器总结
- ConversionService 是 Spring 类型转换体系的核心接口。
- 可以利用ConversionServiceFactoryBean在 Spring 的IOC容器中定义一个ConversionService。 Spring将自动识别出IOC容器中的 ConversionService, 并在Bean属性配置及Spring MVC处理方法入参绑定等场合使用它进行数据的转换。
- 可通过ConversionServiceFactoryBean的converters属性注册自定义的类型转换器。
- 代码示例
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="cyz.converter.UserConverter"></bean>
</list>
</property>
</bean>
-
如何定义一个类型转换器
Spring 支持三种类型转换器,实现任意一个转换器接口都可以作为自定义转换器注册到ConversionServiceFactoryBean中:
5.1. Converter<S,T>: 将S类型对象转换为T类型对象
5.2. ConverterFactory: 将相同系类多个“同质”Converter封装在一起。如果希望将同一种类型的对象转换为另一种类型及其子类的对象(例如将String转换为Number及Number子类(Integer, Long, Double)对象)可使用该转换器工厂类
5.3. GenericConverter: 会根据源类对象及目标类对象所在的宿主类中的上下文信息进行类型转换。
6.下面代码会将自定义的ConversionService注册到Spring MVC的上下文中。
<mvc:annotation-driven conversion-service="conversionService" />
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<ref bean="employeeConverter" />
</set>
</property>
</bean>
- 自己新增加的转换器不会影响Spring MVC原有转换器的正常工作。