Spring3MVC中Controller层接受前端页面的参数有一种情况:
@RequestMapping(value = "/updateStudent.do")
public ModelAndView updateStudent(Student entity) {
// ...
}
Student 类中有如下两个属性
private String name; // 姓名
private Date registDate; // 入学时间
如果此时想修改入学时间,那么前端页面提交过来的日期必然是'2012-01-17'这样的字符串类型的日期
这个时候传入到服务器端会报一个String转成Date的类型转换错误
如果把private Date registDate改成private String registDate;就没问题
于是看了下Spring3的源码,略微做了下修改:在Spring3的core包下找到
org.springframework.core.convert.support.GenericConversionService.convert(Object, TypeDescriptor, TypeDescriptor);这个方法然后在assertNotNull(sourceType, targetType);
这个方法然后在assertNotNull(sourceType, targetType); 这句话的下面添加:
if(targetType.getType().getName().equals("java.util.Date")
&& source instanceof String){
String date = (String)source;
try {
source = YMD_DATETIME_FORMAT.parse(date);
} catch (ParseException e) {
try {
source = YMDHM_DATETIME_FORMAT.parse(date);
} catch (ParseException e1) {
try {
source = YMDHMS_DATETIME_FORMAT.parse(date);
} catch (ParseException e2) {
source = null;
}
}
}
sourceType = targetType;
}
当然还要添加成员变量:
private static final DateFormat YMD_DATETIME_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
private static final DateFormat YMDHM_DATETIME_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm");
private static final DateFormat YMDHMS_DATETIME_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
最后重新编译打包core包
这样当遇到Date类型的时候就把数据转换成Date类型的,接下去就不会报错了
方法二(推荐):
之后在网上找到一个解决方法:
在配置controller的那个xml中添加如下代码:
<!--
配置一个基于注解的定制的WebBindingInitializer,解决日期转换问题,方法级别的处理器映射,
-->
<bean
class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="cacheSeconds" value="0" />
<property name="webBindingInitializer">
<bean class="WebBinding" />
</property>
</bean>
这段配置最好放在其它配置的前面
WebBinding:
import java.util.Date;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.support.WebBindingInitializer;
import org.springframework.web.context.request.WebRequest;
public class WebBinding implements WebBindingInitializer {
@Override
public void initBinder(WebDataBinder binder, WebRequest request) {
// 使用spring自带的CustomDateEditor
// 解决时间转换问题
// yyyy-MM-dd
binder.registerCustomEditor(Date.class,
new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
}
}
由此可见Spring的扩展性还是蛮强的