文档章节

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

Tek_Eternal
 Tek_Eternal
发布于 2015/03/01 10:59
字数 692
阅读 2178
收藏 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
180730-Spring之RequestBody的使用姿势小结

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

小灰灰Blog
07/30
0
0
spring3 controller返回json

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

zchuanzhao
2015/09/29
128
0
Spring MVC学习笔记(三)

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

第五郎
2014/03/24
0
0
SpringMVC 4.0常用注解

注解的出现终结了使用XML配置文件的年代,它让程序拥有更高的可读性,可配置性与灵活性。上一篇介绍的SpringMVC 2.5版本的注解使用已经发布了很多年了,如今项目中使用的4.0版本发生了很大的...

黎嘉诚
2016/08/21
545
1

没有更多内容

加载失败,请刷新页面

加载更多

mysql 数据类型及占用字节数

数字类型 TINYINT                           1 字节 SMALLINT                          2 个字节 MEDIUMINT                         3 个字节...

会游泳的鱼_
43分钟前
3
0
高性能mysql:创建高性能的索引

性能优化简介 MySQL性能定义为完成某件任务所需要的时间量度,换句话说,性能即响应时间,这是一个非常重要的原则。我们通过任务和时间而不是资源来测量性能。数据库服务器的目的是执行SQL语...

背后的辛酸
58分钟前
4
0
HTTP get、post 中请求json与map传参格式

import java.io.IOException;import java.net.URI;import java.net.URISyntaxException;import java.nio.charset.Charset;import java.util.ArrayList;import java.util.List;im......

寒风中的独狼
今天
3
0
IDEA中tomcat启动慢 耗时10分钟

用idea中的tomcat以debug模式启动,会非常的慢,而正常启动没啥问题;原因是debug模式中View Breakpoints断点代码,断点的是jar包,而现在启动由于jar包发生变化,导致启动时一直处于等待中。...

GoodMarver
今天
5
0
Linux学习-10月18(awk)

9.6/9.7 awk 一、awk简介   1. awk是一种编程语言,用于对文本和数据进行处理的   2. 具有强大的文本格式化能力   3. 利用命令awk,可以将一些文本整理成为我们想要的样子   4. 命令awk...

wxy丶
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部