首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  Java

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

  •  
  •   wly19960911 · 2017-04-06 08:42:52 +08:00 · 5419 次点击
    这是一个创建于 776 天前的主题,其中的信息可能已经有所发展或是发生改变。
    基于刚刚学习,不懂相关的知识,也搜不到有用的资料,希望请教一下大家。

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

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

    所以我想请教大家如何接收这样的数据,给个相关的参考或者简单解释做法就好。
    第 1 条附言  ·  2017-04-06 09:43:19 +08:00
    十分感谢大家提供的方法,我先自己测试一次看看,不需要回答解决方法了,如果实在不会再来提问。

    因为初学出了点丑,对自己的蠢表示抱歉了
    24 回复  |  直到 2017-04-06 13:29:09 +08:00
        1
    Citrus   2017-04-06 08:53:14 +08:00 via iPhone
    打异常栈啊。。。光说 415 没用呀。。。
        2
    watzds   2017-04-06 08:59:14 +08:00 via Android   ♥ 1
    可能缺少一个处理时间的 jar 包
        3
    watzds   2017-04-06 09:00:36 +08:00 via Android
    好像是 Joda
        4
    acrisliu   2017-04-06 09:01:04 +08:00 via Android   ♥ 1
    试试自定义 JsonDeserialize 。
    另外 Google 一下的话, stack overflow 上很多解决方案,不懂楼主为啥说搜不到有用的资料,难道我用的假的搜索引擎?
        5
    yang2yang   2017-04-06 09:02:43 +08:00   ♥ 1
        6
    Infernalzero   2017-04-06 09:03:00 +08:00   ♥ 1
    @RequestBody 就可以的,你一定是传的参数有问题,注意 Date 类的 set 方法,前端传的时间参数必须是 timeInMillis 的 long 类型才能转换,而且这里需要设置 ContentType 为 application/json
        7
    DRcoding   2017-04-06 09:03:34 +08:00
    把 model 里的 Date 类型改成 String
        8
    wly19960911   2017-04-06 09:06:15 +08:00
    @acrisliu
    感谢回答,可能我查的姿势不是很正确,我对 springMVC 并不是有很系统的学习。对很多东西没有具体的概念。

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

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

    @DRcoding
    model 我不希望能改变数据类型,我想使用 spring 自定义的转换器或者其他方法解决最好。
        10
    stoldog   2017-04-06 09:09:04 +08:00
    请求的时候加个 contentType
        11
    cs4814751   2017-04-06 09:21:01 +08:00   ♥ 1
    用 Jackson 然后用 @JsonSerialize 配合自己实现的 JsonSerializer 的 serialize 方法 google 可以搜到具体用法
        12
    happypy1   2017-04-06 09:21:30 +08:00   ♥ 1
    写个单元测试,把出了问题的 json 文本 serialize 成那个 model ,看看是否成功。
        13
    johnj   2017-04-06 09:24:49 +08:00
    你的日期是什么格式?
        14
    wly19960911   2017-04-06 09:25:33 +08:00
    @cs4814751
    @happypy1
    好的。十分感谢回答。我测试看看,初学 spring 感觉太多东西不懂了,只能自己摸着走。
        15
    wly19960911   2017-04-06 09:26:41 +08:00
    @johnj
    使用的是 “ yyyy-MM-dd ” 的格式。
        16
    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 接收方便多了。
        17
    cs4814751   2017-04-06 09:37:28 +08:00   ♥ 1
        18
    cs4814751   2017-04-06 09:38:14 +08:00
    @admin9527 initbinder 对 json 没用 只对 url 参数和表单参数有用
        19
    wly19960911   2017-04-06 09:41:28 +08:00
    @admin9527
    确实用 string 接收很方便,但是感觉不利于 model 那边使用,需要多一个步骤去转换,既然 spring 有自带的我还是要了解相关的。

    @cs4814751
    和上面感觉类似的方法,不过很感谢了。
        20
    admin9527   2017-04-06 09:44:29 +08:00
    @cs4814751 恩,是的,没注意,原来都是用在 ajax 表单提交上的
        21
    cs4814751   2017-04-06 09:45:23 +08:00
    @wly19960911 @admin9527 我看岔了 是要反序列化 initbinder 好用 脑抽了以为是序列化
        22
    wly19960911   2017-04-06 09:54:06 +08:00
    @admin9527
    使用表单的话我是测试过可以正常接收,我突然发现自己有点脑抽为什么要用 json 接收 Date ,不过趁机了解这个不会有坏处, get 和 post 方法在 model 使用 @DatetimeFormat 和 controller 上使用 @ModelAttribute 能接收到。
        23
    hiro0729   2017-04-06 10:03:47 +08:00   ♥ 1
    spring mvc 默认用的是 jackson 来解析 json 的,所以 Date 的解析得下面这么用

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date lastupdatetime;
        24
    jelinet   2017-04-06 13:29:09 +08:00
    同意 timeInMillis long 类型。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4009 人在线   最高记录 5043   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 18ms · UTC 07:14 · PVG 15:14 · LAX 00:14 · JFK 03:14
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1