文档章节

使用Spring MVC 的 @RequestBody 映射json请求参数时报异常问题

Tek_Eternal
 Tek_Eternal
发布于 2015/03/01 10:59
字数 692
阅读 2192
收藏 5

使用Spring MVC 的 @RequestBody 映射json请求参数时报“The request sent by the client was syntactically incorrect.”异常解决方案


最近工作中开发RESTful接口需要处理客户端上传的json,图方便想起Spring的Controller中有@RequestBody可以优雅地完成json报文与Java类的映射,但是使用时碰到了 “The request sent by the client was syntactically incorrect.” 异常,记得以前也有碰到过,但是没有把原因记录下来,这次又掉坑里了。又baidugoogle了一会才解决,好记性不如烂笔头,这次还是好好反省下。

###异常原因 字面上理解就是“客户端发送的请求语法不正确”这种意义不明的异常信息。语法不正确说的是什么语法?其实这里指的是***上传的json报文不符合跟对应Java类的映射关系***。举个栗子: 比如页面上Ajax请求的json报文如下:

{"id":1,"name":"zhangsan","gender":1}

Java工程中对应的类定义:

public class Person(){
    private Integer id;
    
    //...setter and getter
}

//Spring中Congroller代码
@Controller
@RequestMapping(value = "/test")
public class TestController{
    @RequestMapping(value = "/index")
    public String index(@RequestBody Person p){
        //do something
        return "testpage";
    }
}

用上述代码映射客户端上传的json报文就会报“The request sent by the client was syntactically incorrect.”异常。原因很简单,因为上传的json报文中有id,name,gender三个字段,而用来映射的java类中只有id字段,匹配不了,这就是所谓的“语法不正确”。如果将上述 Person 类的定义改成:

public class Person(){
    private Integer id;
    private String name;
    private Integer gender;
    //...setter and getter
}

程序再跑起来没问题了。而且,这里的Person还可以多定义几个字段,即:只要客户度上传的json报文字段都有定义,且类型定义正确,使用@RequestBody映射时就不会报“The request sent by the client was syntactically incorrect.”异常。

###总结 在Spring的Controller中使用@RequestBody映射客户端请求的json报文时,需要注意几点:

  1. json报文中有的字段,Java类中也要做定义,且类型必须相同。
  2. Java类中定义的字段,json报文中可以不出现,到时候映射出来的就是null或者默认值。

© 著作权归作者所有

共有 人打赏支持
Tek_Eternal
粉丝 10
博文 24
码字总数 16362
作品 0
福州
程序员
私信 提问
加载中

评论(3)

Dreampie
Dreampie

引用来自“Tek_Eternal”的评论

引用来自“王仁辉(java)”的评论

推荐你用这个极简的restful框架 https://github.com/Dreampie/resty
恩,多谢,工作上的项目不好变动,改天看看你说的这个。:)

不客气,大家互相交流学习
Tek_Eternal
Tek_Eternal

引用来自“王仁辉(java)”的评论

推荐你用这个极简的restful框架 https://github.com/Dreampie/resty
恩,多谢,工作上的项目不好变动,改天看看你说的这个。:)
Dreampie
Dreampie
推荐你用这个极简的restful框架 https://github.com/Dreampie/resty
Spring如何绑定请求参数或PathVariable参数绑定到对象,并做使用@Valid做JSR3

Spring如何绑定请求参数或PathVariable参数绑定到对象,并做使用@Valid做JSR303校验 问题描述 以前在Spring中只对@RequestBody映射的请求参数使用过@Valid做JSR303校验,RequestBody一般适用...

Tek_Eternal
2015/03/14
0
3
【spring】——常用注解介绍

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fjj15732621696/article/details/80643952 组件类注解 在spring注入bean的时候常用的一种方式就是通过注解,装...

DD_Davina
06/10
0
0
spring3 controller返回json

SpringMVC层跟JSon结合,几乎不需要做什么配置,代码实现也相当简洁。再也不用为了组装协议而劳烦辛苦了!一、Spring注解@ResponseBody,@RequestBody和HttpMessageConverterSpring 3.X系列增...

zchuanzhao
2015/09/29
128
0
180730-Spring之RequestBody的使用姿势小结

Spring之RequestBody的使用姿势小结 SpringMVC中处理请求参数有好几种不同的方式,如我们常见的下面几种 根据 对象获取 根据 注解获取url参数 根据 注解获取请求参数 根据Bean的方式获取请求...

小灰灰Blog
07/30
0
0
Spring MVC学习笔记(三)

使用@RequestBody注解映射request body 方法参数注解@RequestBody表明方法参数将被绑定到HTTP请求体中。例如 @RequestMapping(value="/something", method=RequestMethod.PUT)public void h...

第五郎
2014/03/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

js垃圾回收机制和引起内存泄漏的操作

JS的垃圾回收机制了解吗? Js具有自动垃圾回收机制。垃圾收集器会按照固定的时间间隔周期性的执行。 JS中最常见的垃圾回收方式是标记清除。 工作原理:是当变量进入环境时,将这个变量标记为“...

Jack088
昨天
17
0
大数据教程(10.1)倒排索引建立

前面博主介绍了sql中join功能的大数据实现,本节将继续为小伙伴们分享倒排索引的建立。 一、需求 在很多项目中,我们需要对我们的文档建立索引(如:论坛帖子);我们需要记录某个词在各个文...

em_aaron
昨天
27
0
"errcode": 41001, "errmsg": "access_token missing hint: [w.ILza05728877!]"

Postman获取微信小程序码的时候报错, errcode: 41001, errmsg: access_token missing hint 查看小程序开发api指南,原来access_token是直接当作parameter的(写在url之后),scene参数一定要...

两广总督bogang
昨天
31
0
MYSQL索引

索引的作用 索引类似书籍目录,查找数据,先查找目录,定位页码 性能影响 索引能大大减少查询数据时需要扫描的数据量,提高查询速度, 避免排序和使用临时表 将随机I/O变顺序I/O 降低写速度,占用磁...

关元
昨天
15
0
撬动世界的支点——《引爆点》读书笔记2900字优秀范文

撬动世界的支点——《引爆点》读书笔记2900字优秀范文: 作者:挽弓如月。因为加入火种协会的读书活动,最近我连续阅读了两本论述流行的大作,格拉德威尔的《引爆点》和乔纳伯杰的《疯传》。...

原创小博客
昨天
35
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部