springmvc+freemarker 处理时间格式问题

2014/06/18 5454点热度 0人点赞 0条评论

    在使用springmvc使用freemarker的时候,表单里有一个时间类型的字段,保存的时候,点击一下没有任何的反应,断点进不去,监控端也没有看到sql打印。刚开始以为是url的问题,我把url拿出来,单独访问,能进断点。于是我就debug了跟踪了访问信息

DEBUG - No property editor [java.util.DateEditor] found for type java.util.Date according to 'Editor' suffix convention
DEBUG - Resolving exception from handler [public void com.yxkong.system.web.controller.BaseUserController.save(javax.servlet.http.HttpServletResponse,org.springframework.ui.Model,com.yxkong.system.model.BaseUser)]: org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors
Field error in object 'baseUser' on field 'birthday': rejected value [1988-06-05]; codes [typeMismatch.baseUser.birthday,typeMismatch.birthday,typeMismatch.java.util.Date,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [baseUser.birthday,birthday]; arguments []; default message [birthday]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.Date' for property 'birthday'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type java.lang.String to type @javax.persistence.Temporal java.util.Date for value '1988-06-05'; nested exception is java.lang.IllegalArgumentException]

 看到这里我才明白,原来是我页面填写的字符串类型的时间无法转换,再一查原来yyyy-MM-dd在spring中不认它。

看debug的信息,

No property editor [java.util.DateEditor] found for type java.util.Date according to 'Editor'

少了一个转换时间的转换器。我想了又想,有必要这么麻烦吗?应该还有其他的方法。我又到百度里找。

发现了一种方法,只要在bean的属性上添加上对应的注解就可以了

    @Temporal(TemporalType.TIMESTAMP)
    @DateTimeFormat(pattern="yyyy-MM-dd")//该注解将页面上上的字符串1988-01-01转换成对应格式的时间戳
    private Date birthday;

加上DateTimeFormat后保存就可以了。

既然保存都出现问题了,那么展示是不是也会出现问题?

我想起来我配置freemarker的时候的一段代码:

   <bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
       <!-- 模板文件所在目录  templateLoaderPath配置单个, templateLoaderPaths配置多个 -->
       <property name="templateLoaderPaths">
          <list>
             <value>/WEB-INF/common/</value>
             <value>/WEB-INF/pages/</value>
          </list>
       </property>
       <!-- FreeMarker属性配置 -->
       <property name="freemarkerSettings">
           <props>
              <!-- 
                 每隔多长时间检查模板是否更新,单位为秒
                 设置时间过长,会造成开发的时候修改.ftl后页面不刷新
                 建议生产系统设置时间长一些
                 如果不经常更新模板可将更新的延迟时间设定长一点
             -->
             <prop key="template_update_delay">2</prop>
             <prop key="defaultEncoding">UTF-8</prop>
             <prop key="url_escaping_charset">UTF-8</prop>
             <prop key="locale">zh_CN</prop>
             <prop key="boolean_format">true,false</prop>
             <prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>
             <!-- <result column="birthday" property="birthday" jdbcType="DATE" />
                  date_format 映射的是jdbcType,不是bean中的类型
              -->
             <prop key="date_format">yyyy-MM-dd</prop>
             <prop key="time_format">HH:mm:ss</prop>
             <prop key="number_format">0.######</prop>
             <prop key="whitespace_stripping">true</prop>
           </props>
       </property>
    </bean>

页面时.ftl的页面

在页面中我写${item.birthday},出错,解析不了,我想了想会不会是我的mybatis的mapper文件里映射的问题?

  <result column="birthday" property="birthday" jdbcType="TIMESTAMP" />

看了上面的代码,我觉得没问题,为什么配置项不起作用呢?百思不得其解。

继续baidu,找到了这篇问答。http://www.iteye.com/problems/33303

我存入数据库的1988-01-01,我使用jdbcType='TIMESTAMP'

freemarker是按照jdbcType类型去转换的,我将resultMap里的jdbcType改为了jdbcType='DATE',大功告成了。

习惯了struts2的开发,转过来玩springmvc+freemarker还真不习惯。

yxkong

这个人很懒,什么都没留下

文章评论