
本文共 2257 字,大约阅读时间需要 7 分钟。
一般地,出现这种情况很大一部分原因是对ajax中的参数作用不熟悉或者对@RequestBody注解不熟悉。
在jquery的ajax中,如果没加contentType:"application/json",那么data就应该对应的是json对象,反之,如果加了contentType:"application/json",那么ajax发送的就必须是字符串。为什么呢?contentType参数指定的是浏览器将发送什么样类型的编码,比如
text/html : HTML格式
text/plain :纯文本格式
text/xml : XML格式
mage/gif :gif图片
image/jpeg :jpg图片格式
image/png:png图片格式
application/json :json数据格式
application/pdf :pdf格式
application/octet-stream : 二进制流数据
等等。。。
而你不指定contentType则代表为默认的application/x-www-form-urlencoded(表单)类型,这种类型有一个好处,它可以支持很多种情况,并能配合查询字符串(key1=value1&key2=vlaue2)的形式发送到服务器。而且这种默认类型可以很好地配合参数processData(默认为true,可以不用管他),该参数为true的时候,开启自动转化功能,只要是一个合法对象,都能将该对象自动地转化成查询字符串的形式。所以,在contentType默认的情况下(即不写),ajax里的data参数既可以这么传:
$.ajax({
url:"http://xxxxxx",
data: { "username" : "ccc" } , //查询字符串的映射形式(即对象),在默认模式下提交时会自动地转化成查询字符串
.....
});
也可以这么传:
$.ajax({
url:"http://xxxxxx",
data: "username=ccc", //查询字符串形式
.....
});
所以看到这里,差不多也能知道为什么指定了contentType : "application/json"后,data就只能是字符串而且必须是json字符串了,首先你指定json格式,那提交格式肯定与json有关,再一个,因为你指定了"application/json"就意味着你放弃了"application/x-www-form-urlencoded"这种默认模式,默认模式虽可以自动地转化对象,不见得"application/json"这种格式就会自动帮你转,而事实证明,它确实不会帮你自动转。
下面便是两种犯错的例子:
1>前台ajax多加了contentType:"application/json",data却错传成json对象:
后台处理:(employee该pojo对象里有username和password等String字段)
结果都为null
将contentType去掉后,
后台成功反射出对象:
2>ajax中没加contentType:"application/json",data却直接使用了json字符串(和上面的一个道理)
后台情况:
有人就会说,去掉“application/json” 后的默认模式应该是支持字符串和对象的啊,是的,默认模式确实是可以支持两者,但是要看清楚,默认默认支持的字符串是什么?是json字符串吗?不!是查询字符串。
那么如何在application/json这种非默认模式下让Mvc后台接收到收据呢?这里就需要用到@RequestBody注解了,很巧,这个注解就是专门用来处理非默认模式下的请求的。该注解会提取你传过来的json字符串(注意是json字符串,不是查询字符串),并将提取到的信息绑定到对象中。如果上图加了"application/json"那么controller就应该这么接收:
@RequestMapping("xxx")
......
public String test(@RequestBody Employee employee) {
......
}
3>第三点是真的有点恶心的一点,找了好久才找到。。
那就是 有些 关键的属性在Mvc层中反射失败,会导致其他所有属性都为null
比如上面的joindate对应的pojo是Date,本来input框里的值是 Thu Dec 30 00:00:00 CST 1999 ,传到后台用Date接收,但是显然格式不对,于是Date合成出了错,然后坑爹的就来了,因为这个特殊的属性反射失败,Mvc层就将请求打回去然后导致浏览器报错400 bad request ,从而导致其他所有属性都为null。最后把joindate属性注释掉,后台什么属性的值都收到了。。
希望能够帮到大家!
补充:在"application/json"的时候,ajax请求对跨域支持似乎不好,默认模式下的ajax成功跨域请求一旦改成了"application/json"就会报跨域请求的错
--------------------- 作者:虚拟WORLD-er 来源:CSDN 原文:https://blog.csdn.net/qq_37960007/article/details/79542727 版权声明:本文为博主原创文章,转载请附上博文链接!发表评论
最新留言
关于作者
