文档章节

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

Tek_Eternal
 Tek_Eternal
发布于 2015/03/01 10:59
字数 692
阅读 2138
收藏 5
点赞 0
评论 3

使用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
粉丝 9
博文 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
spring3 controller返回json

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

zchuanzhao ⋅ 2015/09/29 ⋅ 0

springMVC初认识

本文为转载学习 原文链接:http://jinnianshilongnian.iteye.com/blog/1594806 Spring Web MVC处理请求的流程 具体执行步骤如下: 1、首先用户发送请求————>前端控制器,前端控制器根据请...

heroShane ⋅ 2014/01/25 ⋅ 0

Spring如何绑定请求参数或PathVariable参数绑定到对象,并做使用@Valid做JSR3

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

Tek_Eternal ⋅ 2015/03/14 ⋅ 3

SpringMVC 4.0常用注解

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

黎嘉诚 ⋅ 2016/08/21 ⋅ 1

SpringMVC工作原理

标签: it 上面的是springMVC的工作原理图: 1、客户端发出一个http请求给web服务器,web服务器对http请求进行解析,如果匹配DispatcherServlet的请求映射路径(在web.xml中指定),web容器将...

LYQ1990 ⋅ 2016/05/31 ⋅ 0

springmvc原理

2.1、Spring Web MVC是什么 Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是...

mrliuze ⋅ 2015/07/08 ⋅ 0

spring MVC中传递的参数对象中包含list的情况!!!!!

测试需要的jar包:spring 3.2.jar + jackson-all-1.8.5.jar。 写代码时碰到个需要将对象里的子明细一起传递到controller里去,当时就想直接将参数一起传递过来,贴下代码: controller: @Req...

yunlielai ⋅ 06/10 ⋅ 0

<mvc:annotation-driven >和context:component-scan的区别 为啥要说这两个注解的区别,因为<mvc:annotation-driven >和context:component-scan放置的位置出错,可能就会导致项目出现404的错误......

小车车 ⋅ 2016/07/07 ⋅ 0

浅谈@RequestMapping @ResponseBody 和 @RequestBody 注解的用法与区别

1.@RequestMapping 国际惯例先介绍什么是@RequestMapping,@RequestMapping 是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为...

满风 ⋅ 05/15 ⋅ 0

可以参考《SpringMVC接口测试异常:Can not deserialize instance

之前使用springmvc搭建了restful风格的接口服务,在使用mockmvc进行集成测试的时候出现了异常:Can not deserialize instance of int out of START_OBJECT token。为什么会出现这个问题?怎么...

萧十一郎君 ⋅ 2016/01/22 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

解决httpclient超时设置不生效的问题

最近公司有项目需要通过http调用第三方服务,且第三方服务偶有超时,故需要设置一定的超时时间防止不响应的情况出现。 初始设置如下: [java] view plain copy //超时设置 RequestConfig re...

Mr_Tea伯奕 ⋅ 4分钟前 ⋅ 0

过滤器Filter和拦截器HandlerInterceptor

过滤器 依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要...

hutaishi ⋅ 9分钟前 ⋅ 0

Redis入门详解(转)

Redis入门详解 Redis简介 Redis安装 Redis配置 Redis数据类型 Redis功能 持久化 主从复制 事务支持 发布订阅 管道 虚拟内存 Redis性能 Redis部署 Redis应用场景 Redis总结 Redis简介: Redi...

xiaoyaoyoufang ⋅ 21分钟前 ⋅ 0

说说javascript中的那些专业名词

DOM(Document Object Model) 文档对象模型 BOM(Browser Object Model) 浏览器对象模型 ECMA(European Computer Manufacturer's Association) 欧洲计算机制造商协会 W3C(World Wide Web Conso......

hang1989 ⋅ 41分钟前 ⋅ 0

Bootstrap Wizard 多步表单控件

废话 有一块需求是 有多步表单 点击下一步时触发验证一个范围内的表单,点击上一步或取消,清空表单并返回第一步,点击最后一步提交整个表单的 就找到了这个插件,本来自己写了一个原生的 fo...

无极之岚 ⋅ 57分钟前 ⋅ 0

如何利用Spring Cloud构建起自我修复型分布式系统

利用Netflix所打造的组件及各类大家熟知的工具,我们完全可以顺利应对由微服务以及分布式计算所带来的技术挑战。 在过去一年当中,微服务已经成为软件架构领域一个炙手可热的新名词,而且我们...

harries ⋅ 今天 ⋅ 0

临近实习前的感想

再过两星期就要开始新的一段实习了,想想去年的这个时候也在实习,心中不免思绪万千,也一直想写对2017做个总结,但一直迟迟没有下笔。 2017年的春节,我就开始准备开学后找份实习。那时候就...

无精疯 ⋅ 今天 ⋅ 0

Spring AOP(面向切面编程)

Spring AOP概念: Spring AOP 可以劫持一个执行的方法,在方法执行之前或之后添加额外的功能。通常情况下,AOP把项目中需要在多处用到的功能,比如日志、安全和事物等集中到一个类中处理,而...

霍淇滨 ⋅ 今天 ⋅ 0

人工智能、机器学习、数据挖掘以及数据分析有什么联系?

人工智能是目前炙手可热的一个领域,所有的互联网公司以及各路大迦们纷纷表态人工智能将是下一个时代的革命性技术,可与互联网、移动互联网时代的变更相媲美;AlphaGo在围棋领域战胜人类最顶...

董黎明 ⋅ 今天 ⋅ 0

使用 vue-cli 搭建项目

vue-cli 是一个官方发布 vue.js 项目脚手架,使用 vue-cli 可以快速创建 vue 项目,GitHub地址是:https://github.com/vuejs/vue-cli 一、 安装 node.js 首先需要安装node环境,可以直接到中...

初学者的优化 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部