首页 java三层 “”字符串解析为date报错

“”字符串解析为date报错

  Spring3MVC中Controller层接受前端页面的参数有一种情况: @RequestMapping…

 

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));
}
免责声明:文章内容不代表本站立场,本站不对其内容的真实性、完整性、准确性给予任何担保、暗示和承诺,仅供读者参考,文章版权归原作者所有。如本文内容影响到您的合法权益(内容、图片等),请及时联系本站,我们会及时删除处理。

为您推荐

Hibernate 中对象 set 属性时自动保存入库的问题

Hibernate 中对象 set 属性时自动保存入库的问题

遇到这个问题了 背景 在某个项目中,通过 Heibernate 查出某个对象后,对属性进行了 set 操作,并没有进行 ...
hibernate中@DynamicInsert和@DynamicUpdate

hibernate中@DynamicInsert和@DynamicUpdate

在Hibernate中可以利用@DynamicInsert和@DynamicUpdate生成动态SQL语句,即在插入和修...
redis简单命令

redis简单命令

linux进入redis redis-cli -p 6379 查询 config get requirepass # 对...
Restrictions 非空验证

Restrictions 非空验证

Hibernate-Restrictions用法 Restrictions or用法   criteria.a...
restrictions.or 动态添加条件

restrictions.or 动态添加条件

Hibernate-Restrictions用法 List<Criterion> criterions = ...
返回顶部