关于 spring MVC 的 @RequestBody 接收 json, Date 类无法转换的问题

2017-04-06 08:42:52 +08:00
 wly19960911
基于刚刚学习,不懂相关的知识,也搜不到有用的资料,希望请教一下大家。

我在尝试使用 spring MVC 的时候,使用 controller 去接受一个 json 并且转换成一个 model ,但是现在有个问题,我在使用 @RequestBody 的时候,如果 model 里面的数据有 Date ,就开始无法转换并且报 415 的错误。

我尝试在 model 里面使用 @DatetimeFormat 去格式化 Date 数据,但是无果。

所以我想请教大家如何接收这样的数据,给个相关的参考或者简单解释做法就好。
8524 次点击
所在节点    Java
24 条回复
Citrus
2017-04-06 08:53:14 +08:00
打异常栈啊。。。光说 415 没用呀。。。
watzds
2017-04-06 08:59:14 +08:00
可能缺少一个处理时间的 jar 包
watzds
2017-04-06 09:00:36 +08:00
好像是 Joda
acrisliu
2017-04-06 09:01:04 +08:00
试试自定义 JsonDeserialize 。
另外 Google 一下的话, stack overflow 上很多解决方案,不懂楼主为啥说搜不到有用的资料,难道我用的假的搜索引擎?
yang2yang
2017-04-06 09:02:43 +08:00
Infernalzero
2017-04-06 09:03:00 +08:00
@RequestBody 就可以的,你一定是传的参数有问题,注意 Date 类的 set 方法,前端传的时间参数必须是 timeInMillis 的 long 类型才能转换,而且这里需要设置 ContentType 为 application/json
DRcoding
2017-04-06 09:03:34 +08:00
把 model 里的 Date 类型改成 String
wly19960911
2017-04-06 09:06:15 +08:00
@acrisliu
感谢回答,可能我查的姿势不是很正确,我对 springMVC 并不是有很系统的学习。对很多东西没有具体的概念。

@watzds
感谢回答,我中午去查一下相关资料看看。

@yang2yang
很感谢提供资料,我中午研究看看。
wly19960911
2017-04-06 09:08:41 +08:00
@Infernalzero
感谢提供信息,到时候查一下看看。 contenttype 确定是 json ,就是时间没有处理好。

@DRcoding
model 我不希望能改变数据类型,我想使用 spring 自定义的转换器或者其他方法解决最好。
stoldog
2017-04-06 09:09:04 +08:00
请求的时候加个 contentType
cs4814751
2017-04-06 09:21:01 +08:00
用 Jackson 然后用 @JsonSerialize 配合自己实现的 JsonSerializer 的 serialize 方法 google 可以搜到具体用法
happypy1
2017-04-06 09:21:30 +08:00
写个单元测试,把出了问题的 json 文本 serialize 成那个 model ,看看是否成功。
johnj
2017-04-06 09:24:49 +08:00
你的日期是什么格式?
wly19960911
2017-04-06 09:25:33 +08:00
@cs4814751
@happypy1
好的。十分感谢回答。我测试看看,初学 spring 感觉太多东西不懂了,只能自己摸着走。
wly19960911
2017-04-06 09:26:41 +08:00
@johnj
使用的是 “ yyyy-MM-dd ” 的格式。
admin9527
2017-04-06 09:37:00 +08:00
@InitBinder
public void initBinder(WebDataBinder binder) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
dateFormat.setLenient(false);

SimpleDateFormat datetimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
datetimeFormat.setLenient(false);

binder.registerCustomEditor(java.util.Date.class, new CustomDateEditor(dateFormat, true));
binder.registerCustomEditor(java.sql.Timestamp.class,new CustomDateEditor(datetimeFormat, true));
}
可以在控制 controller 上加注解,注入的时候应该就会自动转了,不过想想直接用 string 接收方便多了。
cs4814751
2017-04-06 09:37:28 +08:00
cs4814751
2017-04-06 09:38:14 +08:00
@admin9527 initbinder 对 json 没用 只对 url 参数和表单参数有用
wly19960911
2017-04-06 09:41:28 +08:00
@admin9527
确实用 string 接收很方便,但是感觉不利于 model 那边使用,需要多一个步骤去转换,既然 spring 有自带的我还是要了解相关的。

@cs4814751
和上面感觉类似的方法,不过很感谢了。
admin9527
2017-04-06 09:44:29 +08:00
@cs4814751 恩,是的,没注意,原来都是用在 ajax 表单提交上的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/352828

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX