wly19960911
V2EX  ›  Java

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

  •  
  •   wly19960911 · Apr 6, 2017 · 9847 views
    This topic created in 3510 days ago, the information mentioned may be changed or developed.
    基于刚刚学习,不懂相关的知识,也搜不到有用的资料,希望请教一下大家。

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

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

    所以我想请教大家如何接收这样的数据,给个相关的参考或者简单解释做法就好。
    Supplement 1  ·  Apr 6, 2017
    十分感谢大家提供的方法,我先自己测试一次看看,不需要回答解决方法了,如果实在不会再来提问。

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

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

    @yang2yang
    很感谢提供资料,我中午研究看看。
    wly19960911
    wly19960911
    OP
    Apr 6, 2017
    9
    @Infernalzero
    感谢提供信息,到时候查一下看看。 contenttype 确定是 json ,就是时间没有处理好。

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

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

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date lastupdatetime;
    jelinet
    jelinet
    Apr 6, 2017
    24
    同意 timeInMillis long 类型。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1842 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 44ms · UTC 09:18 · PVG 17:18 · LAX 01:18 · JFK 04:18
    ♥ Do have faith in what you're doing.