在开发springMVC接收数据,反序列化对象的时候,遇到了日期格式不能正常转化的问题。
例如:
public class Entity{
private Date date ;
//get set方法略
}
前端传的json数据格式:{"date":"2016-11-11 10:52"}
使用@requestBody Entity entity方式接收数据报错。
查了下官方文档(http://docs.spring.io/spring/docs/4.3.1.BUILD-SNAPSHOT/spring-framework-reference/htmlsingle/#rest-mapping-json-converter),发现下面一段文字:
You convert the request body to the method argument by using an HttpMessageConverter
. HttpMessageConverter
is responsible for converting from the HTTP request message to an object and converting from an object to the HTTP response body. The RequestMappingHandlerAdapter
supports the @RequestBody
annotation with the following default HttpMessageConverters
:
大意是springmvc通过HttpMessageConverter对类型匹配,并转换。
紧接着去看了下,springMVC使用的Message Converters.
发现springMVC 对于json格式的请求使用
MappingJackson2XmlHttpMessageConverter做处理。
那么了解JACKson原理就能帮我们解决问题。
这里有一篇文章讲述了如何使用反序列化来处理格式问题。http://jackyrong.iteye.com/blog/2005323
使用这种方式,对于每种不同的格式化数据,都得去写一个处理类,并且还要注解,显得很麻烦。
于是我想到了第二种方式。
接收数据的时候,我使用string类型接收,然后使用阿里的fastjson去转换数据。
例如:
@RequestBody String myEntity
Entity entity = JSONObject.parseObject(myEntity,Entity.class);
@JSONField(format="yyyy-MM-dd HH:mm")
private Date date ; //格式化
但是再使用这种方式转换的时候,发现日期格式“2016-11-11 10:52”,也不能正确转换。
查了相关文档发现阿里支持的反序列化日期格式为:
- ISO-8601日期格式
- yyyy-MM-dd
- yyyy-MM-dd HH:mm:ss
- yyyy-MM-dd HH:mm:ss.SSS
- 毫秒数字
- 毫秒数字字符串
- .NET JSON日期格式
- new Date(1982932381111)
显然,这些不能满足我的需求。
于是在github(https://github.com/alibaba/fastjson/releases)上下载fastJson源码修改后编译:
找到com\alibaba\fastjson\util\TypeUtils.java对下面一段代码编辑:
if (value instanceof String) { String strVal = (String) value; JSONScanner dateLexer = new JSONScanner(strVal); try { if (dateLexer.scanISO8601DateIfMatch(false)) { Calendar calendar = dateLexer.getCalendar(); return calendar.getTime(); } } finally { dateLexer.close(); } if (strVal.startsWith("/Date(") && strVal.endsWith(")/")) { String dotnetDateStr = strVal.substring(6, strVal.length() - 2); strVal = dotnetDateStr; } if (strVal.indexOf('-') != -1) { String format; if (strVal.length() == JSON.DEFFAULT_DATE_FORMAT.length()) { format = JSON.DEFFAULT_DATE_FORMAT; } else if (strVal.length() == 10) { format = "yyyy-MM-dd"; } else if (strVal.length() == "yyyy-MM-dd HH:mm:ss".length()) { format = "yyyy-MM-dd HH:mm:ss"; } else { format = "yyyy-MM-dd HH:mm:ss.SSS"; } SimpleDateFormat dateFormat = new SimpleDateFormat(format, JSON.defaultLocale); dateFormat.setTimeZone(JSON.defaultTimeZone); try { return (Date) dateFormat.parse(strVal); } catch (ParseException e) { throw new JSONException("can not cast to Date, value : " + strVal); } } if (strVal.length() == 0) { return null; } longValue = Long.parseLong(strVal); }
对这段代码进行扩展:
if (strVal.indexOf('-') != -1) { String format; if (strVal.length() == JSON.DEFFAULT_DATE_FORMAT.length()) { format = JSON.DEFFAULT_DATE_FORMAT; } else if (strVal.length() == 10) { format = "yyyy-MM-dd"; } else if (strVal.length() == "yyyy-MM-dd HH:mm:ss".length()) { format = "yyyy-MM-dd HH:mm:ss"; } else { format = "yyyy-MM-dd HH:mm:ss.SSS";
}
编译后放入项目中,即可。
总结:遇到问题时候,查找官方文档,能帮助迅速定位问题,至于如何解决问题,仁者见仁智者见智。
相关推荐
模拟了基本前端与后端交互JSon数据,使用了Java语言+Maven+SpringMVC+Ajax @RequestBody+Json传输完成基本数据交互
用来解决SpringMVC+Ajax技术中前台报406的错误信息,实现后台json格式与前台一致
主要介绍了详解SpringMVC @RequestBody接收Json对象字符串,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
使用springMVC+ajax+json的一个小demo,希望对读者有用
springmvc_hibernate+json lib包
springmvc对json支持
下面小编就为大家带来一篇springmvc fastjson 反序列化时间格式化方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
jackson-databind-2.4.2.jar jackson-core-2.4.2.jar jackson-annotations-2.4.0.jar
本篇文章主要介绍了springmvc学习笔记-返回json的日期格式问题的解决方法,解决了日期格式的输出,有兴趣的可以了解一下。
Spring+SpringMVC+MyBatis返回json所需jar包,SSM返回json数据,jackson包
压缩包中有2个项目: 1、fes,这项目是整合后的项目,运行这个项目可以看到整合后的效果。 2、ext4,这个项目是用来做ext的公共js库用的,这样不比没个项目都添加ext的js文件,方便开发。 切记将ext4项目部署上去...
学习SpringMVC处理JSON数据的具体实现和基本原理,同时会使用HttpMessageConverter
springmvc spring hibernate ajax json简单完整的demo下载可直接运行,希望可以帮助大家
jack-json包和配置,springmvc3.2及以下json格式支持。低版本spring福利,application/json不支持,可以用此包和配置。
springMVC 采用POST提交的方法接收json格式的参数需要的jar包
NULL 博文链接:https://jinnianshilongnian.iteye.com/blog/1718813
html+SpringMVC+MyBaties+Json+Mysql实现分类查询并导出EXCE 包含数据库sql 如有异议请发站内信。
2.请求头中正确设置了Content-Type参数及参数值,但是在项目jar依赖中(pom.xml或build.gradle)没有添加处理json字符串的处理类
spring整合redis(spring模板+连接池+json序列化+cluster集群).zip
主要介绍了SpringMVC restful 注解之@RequestBody进行json与object转换的相关资料,需要的朋友可以参考下