【springboot】前端ajax 传递 json 对象出现的错误,后端使用@RequestBody 接收参数对 并绑定到对象上: 错误信息如下
.w.s.m.s.DefaultHandlerExceptionResolver : Resolved exception caused by handler execution: org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Unexpected character ('%' (code 37)): expected a valid value (number, String, array, object, 'true', 'false' or 'null'); nested exception is com.fasterxml.jackson.core.JsonParseException: Unexpected character ('%' (code 37)): expected a valid value (number, String, array, object, 'true', 'false' or 'null')
at [Source: (PushbackInputStream); line: 1, column: 2]
2019-01-26 18:48:59.531 INFO 7468 --- [io-8083-exec-13] c
- 产生原因分析:
在SpringMVC环境中, @RequestBody接收的是一个Json对象的字符串,而不是一个Json对象。然而在ajax请求往往传的都是Json对象,后来发现用JSON.stringify(data)的方式就能将对象变成字符串。同时ajax请求的时候也要指定dataType:
“json”,contentType:"application/json"这样就可以轻易的将一个对象传到Java端,使用@RequestBody即可绑定对象;解决方式如下 - 我的前端代码如下
function addSysDict(obj) {
var url = $(obj).attr("href");
var params = ["nameDict","typeDict","valueDict","codeDict","remarkDict"];
var data ={};
for(var i=0;i<params.length;i++){
var val = $("#"+params[i]).val();
/*这里不需要拼接"key":"valus" 这种格式 */
/* data['"'+params[i].substring(0,params[i].length-4)+'"']=val;*/
// 正确处理
data[params[i].substring(0,params[i].length-4)]=val;
}
console.log(data);
// 将json 对象 转成 json 字符串
var param = JSON.stringify(data);
$.ajax({
"url":url,
"type":"POST",
"data":param,
"contentType":'application/json',
success:function(data){
console.log(data);
alert("request success ! ");
}
});
}
- 后端接收请求代码
@PostMapping("sysDictAdd")
@ApiOperation("新增数据字典")
public ModelAndView sysDictAdd(@RequestParam(value = "viewName",required = false,
defaultValue = "/pages/sysDict/sysDictAdd.html" ) String viewName,
ModelAndView mv,
@RequestBody SysDictEntity sysDictEntity){
log.info(sysDictEntity.getName()+".."+sysDictEntity.getRemark());
return null;
}