关于 spring MVC 的 @RequestBody 接收 json, Date 类无法转换的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wly19960911
V2EX    Java

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

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

    我在尝试使用 spring MVC 的时候,使用 controller 去接受一个 json 并且转换成一个 model ,但是现在有个问题,我在使用 @RequetBody 的时候,如果 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 为 appliction/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
      &nbs; 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     Solana     1203 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 17:28 PVG 01:28 LAX 10:28 JFK 13:28
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86