1.前言
SpringMVC 通过反射机制对处理方法的签名进行分析,并将请求信息绑定到处理方法的参数中,在请求消息到达处理方法期间,SpringMVC 还会完成数据转换,数据格式化和数据检验等工作;
2.Converter转换器
2.1 Spring在org.framework.core.convert.converter包中定义了3中类型的转换器接口;
2.1.1 Converter<S,T>接口:提供单一方法:T convert(S source);该方法负责将S类型的对象转换为T类型的对象;
2.1.2 ConverterFactory<S,R> :提供单一方法 <T extends R> Converter<S,T> getConverter(Class<T> targetType);该方法负责将一种类型的对象转换为另一种类型及其子类对象,例如String转换为Number及Number子类Integer、Double等对象;
2.1.3 GenericConverter接口:该接口会根据源类对象及目标类对象的上下文信息进行类型转换。接口定义的方法如下
1)Set<GenericConverter.ConvertiblePair> getConvertibleTypes();
2)Object convent(Object source TypeDescriptor sourceType,TypeDescriptor targetType);
3.时间转换器
3.1 在实际的开发过程中,前台如果传递字符串类型的参数birthday(2018-08-01 12:06:11),后台Date类型的birthday去接收这个值会报错,所以我们需要自定义字符串转时间类型的转换器,将传递的字符串转换为Date类型;
3.2 实现步骤:
3.2.1 定义实现Converter<S,T>接口的实现类
package org.aaron.framework.common;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.springframework.core.convert.converter.Converter;
public class DateConverter implements Converter<String, Date> {
private String pattern;
public String getPattern() {
return pattern;
}
public void setPattern(String pattern) {
this.pattern = pattern;
}
@Override
public Date convert(String date) {
try {
SimpleDateFormat dateFormat = new SimpleDateFormat(this.pattern);
return dateFormat.parse(date);
} catch (ParseException e) {
e.printStackTrace();
return null;
}
}
}
3.2.2 在spriingmvc.xml(Spring MVC配置文件)中加入自定义转换器:
<!-- conversionService 自定义字符串-时间转换器 -->
<mvc:annotation-driven conversion-service="conversionService" />
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<!-- 转换器 -->
<property name="converters">
<list>
<bean class="org.aaron.framework.common.DateConverter" p:pattern="yyyy-MM-dd HH:mm:ss" />
</list>
</property>
</bean>