后台接收前端传过来的数据往往与后台定义的实体类的属性类型并不匹配,就需要用到数据类型转换,若在每个代码文件中手动去转就非常麻烦。Spring MVC提供了默认转换器,也提供了接口用于实现自定义的类型转换器。
数据绑定流程
Spring MVC通过反射机制对目标处理方法进行分析,并将请求消息绑定到处理方法的参数中。核心部件是DataBinder
。
- Spring MVC框架将ServletRequest对象处理方法的参数对象实例传递给
DataBinder
, - DataBinder调用装配在
Spring Web
上下文中的ConversionService
组件进行数据类型转换,数据格式化工作,并将ServletRequest
中的消息填充到参数对象中。 - 然后调用
Validator
组件对已经绑定的请求消息的参数对象进行数据合法性郊验,并最终生成数据绑定结果BindingResult
对象。
BindingResult
对象包含已完成数据绑定的对象,还包含相应的校验错误对象,会被赋给处理方法的相应参数。
数据转换
org.springframework.core.convert.ConversionService是Spring类型转换体系的核心接口,可以利用org.springframework.context.support.ConversionServiceFactoryBean在Spring的上下文中定义一个ConversionService
。Spring 将自动识别出上下文中的ConversionService,并在 Spring MVC处理方法的参数绑定中使用它进行数据转换。
Spring注解驱动<mvc:annotation-driven/>
装配了一个默认的数据转换器ConversionService
,可以满足大多数数据类型转换的需求, 当然也可以自定义转换器。
自定义数据转换器
实现Converter接口
Spring在org.springframework.core.convert.converter包中定义了3种类型转换器接口,只需实现其中任意一种转换器接口,并将它作为自定义转换器注册到ConversionServiceFactoryBean
中。
3种类型转换器接口如下所示:
- Converter
:最简单的接口
方法:T convert(S source);,将S
类型的对象转换为T
类型的对象。 - ConverterFactory
该接口将相同系列多个Converter
封装在一起。S 为源类型,R 为目标类型的基类,T 为 R 的子类。
方法:Converter ,getConverter(ClasstargetType); - GenericConverter
根据源类对象及目标类对象的上下文信息进行类型转换。
方法1:SetgetConvertibleTypes();
方法2:Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType);
示例代码
实现
Converter
接口的转换器类import org.springframework.core.convert.converter.Converter; public class StringToDateConverter implements Converter<String, Date>{ private String datePattern; public void setDatePattern(String datePattern) { this.datePattern = datePattern; } @Override public Date convert(String date) { SimpleDateFormat simpleDateFormat = new SimpleDateFormat(this.datePattern); try { return simpleDateFormat.parse(date); } catch (ParseException e) { e.printStackTrace(); } return null; } }
Springmvc.xml
配置文件加入自定义转换器<!-- 注解驱动,替换默认的转换器 --> <mvc:annotation-driven conversion-service="conversionService" /> <!-- 自定义的类型转换器 --> <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"> <property name="converters"> <list> <!-- 自定义转换器 --> <bean class="com.commons.utils.StringToDateConverter"> <property name="datePattern" value="yyyy-MM-dd HH:mm:ss"></property> </bean> </list> </property> </bean>
定义一个
User
实体类,添加Date
类型的birtyday
属性。- 后台
Controller
处理方法使用对象接收前端请求的参数。 - 前端发送请求,带有日期格式的
birtyday
参数发给后台。
@InitBinder自定义编辑器转换数据
创建一个编辑器类,继承PropertyEditorSupport
,在Controller
层增加initBinder()
方法,使用@InitBinder
注解。
比较麻烦,不建使用
WebBindingInitializer注册全局自定义编辑器转换数据
- 实现
WebBindingInitializer
接口,重写initBinder()
方法,在方法中注册自定义编辑器。 - 在
springmvc.xml
中装配自定义编辑器。
注意:本文归作者所有,未经作者允许,不得转载