在使用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还真不习惯。
文章评论