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的扩展性还是蛮强的