POST方法给@RequestBody传参数失败的解决及原因分析

目录
  • POST方法给@RequestBody传参数失败
  • @RequestBody参数映射不上,@RequestBody报错
    • 言归正传问题是这样的
    • 报错原因

POST方法给@RequestBody传参数失败

通过ajax给springMVC传递参数时,通过post方法传递json字符串时常用的方式,这时后端应该通过@RequestBody注解配合springMVC中配置的消息转换器来进行json字符串的解析。

因为post方法中的json字符串通常是一个前端的json对象转化而成的字符串,所以后端@RequestBody后面可以使用HashMap<String,Object>类型来接收所有参数。

通过这种方式可以非显式的传送大量的参数到后端,并且和具体参数无关,便于以后对参数进行扩展,对于不确定参数的场合,这种方式解除了与具体参数的耦合。但是由于简单的过程实际上经历了许多SpringMVC的操作,所以经常会遇到各种奇怪问题。

其中post方法请求体中的json字符串无法成功通过SpringMVC中配置的MessageConverter(一般是MappingJackson2HttpMessageConverter)转换为@RequestBody注解的HashMap对象,是可以见到的问题。

这个时候你可以检查下ajax请求的content-type请求头,因为在配置MessageConverter消息转换器的时候,需要配置其所检查的请求体类型(content-type),默认情况下浏览器的ajax会添加content-type:application/x-www-form-urlencoded的请求头,但是有的浏览器或者有些时候会发送content-type:application/x-www-form-urlencoded;charset:utf-8到后端,导致MappingJackson2HttpMessageConverter漏过对它的检查,这个时候SpringMVC会使用其他的MessageConverter来解析request body中的内容,这样肯定是会解析失败的。

如果遇到这种情况,比较好的解决方式,可能是在ajax的post请求中强制注明 contentType:application/json,并将application/json 和application/json;charset=utf-8两种MediaType(MimeType)添加到MappingJackson2HttpMessageConverter对象的检查列表中。

这样就可以保证post方法的请求体中的json字符串被MappingJackson2HttpMessageConverter对象检查并解析。

@RequestBody参数映射不上,@RequestBody报错

最近代码遇见了一个springmvc中的小问题,算是很基础的东西,同事问我后我有有些迷惑上网找了一些资料后弄清楚了。特此记录一下springmvc注解@requestbody来传递参数映射一个对象。

言归正传问题是这样的

使用postMan 发送httppost 请求:

最后报错。

报错原因

在使用postMan发送post请求的时候没有选择如下:

也就是下面说的需要注意的地方需要注意的地方是:

1.前端做保存操作的时候提交了很多参数过来,前端代码提交的时候content-type改成application/json,后台也配置了一个针对spring4的son类型的httpmessageConverter,

@RequsetBody 绑定的数据类型 :

一般用来处理非Content-Type: application/x-www-form-urlencoded编码格式的数据。

GET请求中,因为没有HttpEntity,所以@RequestBody并不适用。POST请求中,通过HttpEntity传递的参数,必须要在请求头中声明数据的类型Content-Type,SpringMVC通过使用HandlerAdapter 配置的HttpMessageConverters来解析HttpEntity中的数据,然后绑定到相应的bean上。

1,使用@RequestBody 前后端参数要匹配个数不能少。字段名字要一样

2,检查配置文件spring的版本。对应的 spring4 的版本的适配器 对应的:

请用org.springframework.http.converter.json.MappingJacksonHttp2MessageConverter ,选择的这种配置用的是jackson2.X版本的,用来解析json数据。

spring 3.x的对应的版本:

org.springframework.http.converter.json.MappingJacksonHttpMessageConverter

这种配置用的是jackson1.X版本的

3,必须要在请求头中声明数据的类型Content-Type,

4,前端json数据和后端json数据 首字母不要大写,首字母大写映射不上,以驼峰格式命名。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • springboot中不能获取post请求参数的解决方法

    问题描述 最近在做微信小程序,用的spring boot做后端,突然发现客户端发送post请求的时候服务端接收不到参数.问题简化之后如下: 微信小程序端: 在页面放一个按钮进行测试 <!--index.wxml--> <view class="container"> <button catchtap='testpost'>点击进行测试</button> </view> 绑定一个函数发送post请求 //index.js //获

  • 快速解决SpringMVC @RequestBody 用map接收请求参数的问题

    一:遇到个跨域调用,因为传个我的参数不定,所以需要通过map来接收参数并进行签名验证等操作 理所当然的写出了下面的代码,但是发现map里并没有获取到传来的key-value值 @RequestMapping(value = "/callback", produces = "text/html;charset=UTF-8") @ResponseBody public String callback(@RequestBody Map<String, String&

  • java通过HttpServletRequest获取post请求中的body内容的方法

    在java web应用中,我们如何获取post请求body中的内容?以及需要注意的问题. 通常利用request获取参数可以直接通过req.getParameter(name)的方式获取url上面或者ajax data提交上来的参数.但是body是没有名字的,无法通过参数名字这种方式获取.这时候需要用到io流的方式来获取body中的内容. 这里先贴出一段代码: package com.lenovo.servlet; import java.io.BufferedReader; import ja

  • POST方法给@RequestBody传参数失败的解决及原因分析

    目录 POST方法给@RequestBody传参数失败 @RequestBody参数映射不上,@RequestBody报错 言归正传问题是这样的 报错原因 POST方法给@RequestBody传参数失败 通过ajax给springMVC传递参数时,通过post方法传递json字符串时常用的方式,这时后端应该通过@RequestBody注解配合springMVC中配置的消息转换器来进行json字符串的解析. 因为post方法中的json字符串通常是一个前端的json对象转化而成的字符串,所以后端

  • Mysql安装注意事项、安装失败的五个原因分析

    错误1:wizard安装最后一页,出现cannot create Windows service for mysql.error:0 错误 解决方法:打开命令行 输入 sc delete mysql 命令即    C:>sc delete mysql    [SC] DeleteService SUCCESS 重起电脑,或者卸载后重启再安装,这样就好了.我是卸载后重启的. 卸载重新安装要注意一个问题,在控制面板中卸载后,要去c:\Documents and Settings\All Users\

  • HipChat上传文件报未知错误的原因分析及解决方案

    HipChat的功能类似于Campfire.Sazneo等在线协同工具,并且和Yammer以及Salesforce的Chatter等企业社交平台有一定相似之处.你可以为单个项目或者小组搭建自有的聊天室,也可以很方便的发起一对一聊天.这套 IM 系统还整合了团队文件管理和分享,拖拽就能完成保存操作. 前言 HipChat是Atlassian公司的一款团队协作即时通讯工具,服务端为Linux(官方给的服务端就是一个虚拟机),在Windows.Linux.Android.IOS.Mac等平台都有客户端

  • mybatis初始化SqlSessionFactory失败的几个原因分析

    目录 mybatis初始化SqlSessionFactory失败 总结原因有几点 SqlSessionFactory异常 mybatis初始化SqlSessionFactory失败 总结原因有几点 1.resources中的xml配置文件放错位置或者是放的太深加载不到 比如 RoleDao因为放的比较包中包中所以扫描不到 2.xml文件里面有错文 比如mapper namespace的相对路径有问题 导致初始化错误 SqlSessionFactory异常 org.springframework.

  • 解决struts2 拦截器修改request的parameters参数失败的问题

    目录 struts2拦截器修改request的parameters参数失败 修改指定拦截器的参数(Struts2) struts2 拦截器修改request的parameters参数失败 为了解决struts2的xss(跨站脚本攻击)问题,我打算用struts2自带的拦截器来过滤所有由request传递来的参数. <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC &quo

  • 使用@RequestBody传对象参数时碰到的坑

    目录 @RequestBody传对象参数时碰到的坑 我的真实代码是这样的: 也就是下面的区别: @RequestBody 的正确使用 @RequestBody接收的是一个Json对象 @RequestBody的使用 @RequestBody传对象参数时碰到的坑 工作中需要使用到http接口传一个对象数组,网上找到某博客:springmvc参数为对象,数组 但是测试还是不对,报错: 2019-02-21 23:44:37.168 WARN 34133 --- [nio-7001-exec-6] .

  • js的form表单提交url传参数(包含+等特殊字符)的两种解决方法

    方法一:(伪装form表单提交) linkredwin = function(A,B,C,D,E,F,G){ var formredwin = document.createElement("form"); formredwin.method = 'POST'; document.body.appendChild(formredwin); formredwin.action = "http://www.A.com/A.wiki?A=" +encodeURI(A) +

  • JS给swf传参数的实现方法

    如下所示: 不仅可以用flashvars ="name=12&age=23" 还可以在指定swf地址时传参数src="test.swf?name=12&age=23" 以上这篇JS给swf传参数的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • JS函数arguments数组获得实际传参数个数的实现方法

    JS与PHP在函数传参方面有点不同,PHP形参与实参个数要匹配,而JS就灵活多了,可以随意传参,实参比形参少或多都不会报错. 实参比形参多不会报错 function say(a){ alert(a); } say('琼台博客','WEB技术博客'); 执行结果 我们再来看看形参比实参多的结果 function say(a,b){ alert('a 的值是 '+a+'\nb 的值是 '+b); } say('琼台博客'); 执行结果 a 对应第一个实参"琼台博客",b 没有对应的实参所以

  • Shell脚本传参数方法总结

    一.接收固定长度的参数 复制代码 代码如下: [root@svn shell_example]# cat params.sh #!/bin/bash #传参测试脚本 echo "My name is `basename $0` -I was called as $0" echo "My first parameter is : $1" echo "My second parameter is : $2" 空参数执行 复制代码 代码如下: [roo

随机推荐