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

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

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

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

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

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

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

    @cs4814751
    和上面感觉类似的方法,不过很感谢了。
    admin9527
        20
    admin9527  
       2017-04-06 09:44:29 +08:00
    @cs4814751 恩,是的,没注意,原来都是用在 ajax 表单提交上的
    cs4814751
        21
    cs4814751  
       2017-04-06 09:45:23 +08:00
    @wly19960911 @admin9527 我看岔了 是要反序列化 initbinder 好用 脑抽了以为是序列化
    wly19960911
        22
    wly19960911  
    OP
       2017-04-06 09:54:06 +08:00
    @admin9527
    使用表单的话我是测试过可以正常接收,我突然发现自己有点脑抽为什么要用 json 接收 Date ,不过趁机了解这个不会有坏处, get 和 post 方法在 model 使用 @DatetimeFormat 和 controller 上使用 @ModelAttribute 能接收到。
    hiro0729
        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;
    jelinet
        24
    jelinet  
       2017-04-06 13:29:09 +08:00
    同意 timeInMillis long 类型。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1665 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 16:35 · PVG 00:35 · LAX 08:35 · JFK 11:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.