1.问题提出
虽然SpringMVC可以完成大部分的类型转化,但少数情况下,需要我们自己定义类型转换器。
如日期格式,SpringMVC能将yyyy/MM/dd格式的日期自动映射给Date类型
但如果我想使用yyyy-MM-dd格式,就需要自己定义类型转换器,否则会报400错误
先测试一下不配自定义类型转换器,用yyyy-MM-dd格式转换:
控制层:
@RequestMapping(value = "/date")
@ResponseBody
public void date(Date date){
System.out.println(date);
}
2.解决
2.1编写自定义类型转换器,实现Convert接口的convert方法
/**
* 1.自定义日期类型转换器,实现Convert接口(S,R)
* S-原始类型
* R-转换后类型
*/
public class DateConverter implements Converter<String, Date> {
@Override
public Date convert(String dateStr) {
Date date=null;
try {
date = new SimpleDateFormat("yyyy-MM-dd").parse(dateStr);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
}
2.2在xml中声明该类型转换服务
<!--声明自定义类型转换器-->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.itheima.converter.DateConverter"></bean>
</set>
</property>
</bean>
2.3在xml annotation-driven标签中引用该类型转换服务
<!--conversion-service="conversionService"引用自定义转换服务-->
<mvc:annotation-driven conversion-service="conversionService"/>
这里的conversionService需要与上一步的id保持一致
3.测试
成功解决
4.注意
如果配了自定义的类型转换器,原来的yyyy/MM/dd方式就不能使用了,否则后台报ParseException
5.总结
对于需要自定义类型转换器的场景,分三步完成
1.编写自定义类型转换器,实现Convert接口的convert方法
2.将该自定义类型转换器注入到ConversionServiceFactoryBean的converters属性中(声明自定义类型转换服务)
3.引用类型转换服务<mvc:annotation-driven conversion-service="类型转换服务id">