Spring3MVC 提交请求参数中的日期问题(java.lang.String cant not convert to java.util.Date)

 

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

 

你可能感兴趣的:(spring,bean,Date,mvc,String,Class)