记得刚学springMVC那会儿,使用@responseBody这个注解总是达不到自己想要的效果,但是又找不到到底是为什么,所以后面就尽量避免使用该注解。今天闲来无事就想再来试试该注解,虽然过程很让我抓狂,但是最终还是成功了。
1、前台传参,后台接受不到
(1)前台ajax:
$("#mvc_link").bind("click",function(){
var option = {};
option.url = "${pageContext.request.contextPath }/test/testHandler.do";
option.async = true;
option.type = "POST";
option.contentType = "application/json;charset=utf-8";
option.dataType = "json";
option.data = {"name":"张三","sex":"男"};
option.success = function(result){
console.log(result.name);
};
$.ajax(option);
});
后台controller
@RequestMapping(value="/testHandler",
produces = "application/json; charset=UTF-8")
@ResponseBody
public Person testHandler(Person person){
return person;
}
这样写,后台testHandler()中的形参person接收不到传过来的值。请求是这样的
参数形式类似GET请求,同时参数被编码过,但是具体为什么参数绑定不到person中去,还不太明白。
(2)把contentType那一行注释掉,参数顺利绑定到形参上。请求是这样的
(3)把data改为JSON.stringify({"name":"张三","sex":"男"}),参数无法绑定。请求是这样的
(4)在(3)的基础上,把contentType注释掉,参数无法绑定。请求如下
总结:
要想在前台传json数据,那么前台contentType应当为默认值,并且json要求是一个json对象,不能使一个json字符串。
2、使用@responseBody的问题。
(1)前台报406错误
这个问题归结起来就是一点:导包问题:没有导入jackson的jar包
(2)导包之后,控制台出现
java.lang.NoClassDefFoundError: com/fasterxml/jackson/core/util/DefaultIndenter
这个主要是jackson版本问题。
我是用的spring版本是4.3.5,而jackson-core则是2.4,换成2.7之后就好了。
这个可以参考下面的这篇博客,写得非常好。
Caused by: java.lang.NoClassDefFoundError: com/fasterxml/jackson/core/util/DefaultIndenter