如何使用Ajax向Spring Boot控制器传递Java对象?400错误如何排查?
错误原因
- 前端传参存在多余嵌套层级:构造ajax请求参数时,你将
xpTableCriteria先后套入parameter对象和额外的{}中,最终提交的参数结构为parameter[xpTableCriteria][字段名],和后端需要的参数结构完全不匹配。 - 后端注解使用错误:
@RequestParam仅用于映射单个请求参数,无法直接绑定到自定义Java对象上,GET请求下要绑定自定义对象不需要加该注解。
修复方案
前端代码修改
直接将xpTableCriteria对象作为ajax的data参数传递,删除多余的嵌套:
function getTableData(){ var xpTableCriteria = {globalSearch: "test", columnsSearchCriteria: "test2"}; $.ajax({ type : 'GET', data : xpTableCriteria, dataType: 'json', url : 'all', success : function(result) { alert("OK"); }, error: function (xhr, ajaxOptions, thrownError) { alert(xhr.responseText); } }); }
后端控制器代码修改
删除方法参数前的@RequestParam注解即可:
@GetMapping(value = "/all") @ResponseBody public XpTableCriteria getAll(XpTableCriteria xpTableCriteria) { // 此处可正常获取到两个字段的赋值 return xpTableCriteria; }
可选扩展:如果要使用POST传JSON格式参数
如果后续需要提交更复杂的参数结构,可以改用POST请求,修改如下:
- 前端ajax修改
type为POST,添加contentType: 'application/json',将data转为JSON字符串:
$.ajax({ type : 'POST', data : JSON.stringify(xpTableCriteria), contentType: 'application/json', dataType: 'json', url : 'all', // 其余配置不变 })
- 后端将
@GetMapping改为@PostMapping,参数前加@RequestBody注解:
@PostMapping(value = "/all") @ResponseBody public XpTableCriteria getAll(@RequestBody XpTableCriteria xpTableCriteria) { return xpTableCriteria; }
内容的提问来源于stack exchange,提问作者Tharsant
相关产品推荐
相关产品推荐

