程序员一代码搬运工
【Java学习心得和Java学习技术个人总结】

“”字符串解析为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;  
}

 

当然还要添加成员变量:

  1. private static final DateFormat YMD_DATETIME_FORMAT = new SimpleDateFormat(“yyyy-MM-dd”);
  2. private static final DateFormat YMDHM_DATETIME_FORMAT = new SimpleDateFormat(“yyyy-MM-dd HH:mm”);
  3. 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’m’vc在对应的controller中增加属性编辑器:

@InitBinder
protected void initBinder(WebDataBinder binder) {
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
}
赞(0)
未经允许不得转载:程序员一代码搬运工 » “”字符串解析为date报错
分享到: 更多 (0)