SpringMVC后台接收Ajax传递复杂对象报错property path is neither an array nor a List

SpringMVC后台接收Ajax传递复杂对象报错property path is neither an array nor a List nor a Map

今天遇到一个问题,我在前台传递参数后台使用javabean接收的时候报错property path is neither an array nor a List,大体意思是说属性既不是数组也不是列表。

一、存在问题的代码

JS代码:

1
2
3
4
5
6
7
8
9
10
11
12
var param = {
pvqId:pvqId,
chooseOptionId:chooseOptionId,
optionList:[{
pvoId:pvoId,
fillOptionContext: fillOptionContext
}]
};

$.post("/wx/doExamAnswer", param, function (data) {
console.log(data);
}, "json");

Java代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@RequestMapping(value = "/wx/doExamAnswer", method = RequestMethod.POST)
@ResponseBody
public ResponseResult doExamAnswer(ExamAnswerForm examAnswerForm) {
//......
return ResponseResult.build(ResponseCodeEnum.SUCCESS, "");
}

/**
* @Description 用户答题提交DTO
* @Author jie.zhao
* @Date 2019/11/4 14:47
*/
public class ExamAnswerForm {
private Long pvqId;
private String chooseOptionId;
List<ExamAnswerOption> optionList;
//省略get/set
}

class ExamAnswerOption{
private Long pvoId;
private String fillOptionContext;
//省略get/set
}

以上传参和接收参数都是比较常规的写法,根据报错提示可能是List optionList;这个属性的问题。

二、问题原因

原因是因为JQuery会将你的这个optionList参数映射成这样:

1
2
optionList[0][pvoId]=1
optionList[0][fillOptionContext]=111

而SpringMVC需要这样的参数格式:

1
2
optionList[0].pvoId=1
optionList[0].fillOptionContext=111

三、解决方案

使用@RequestBody注解将请求中的json参数转换成java对象,使用时需要前台将content-Type设置为application/json,必须要将JSON对象转换为JSON字符串。

JS代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var param = {
pvqId:pvqId,
chooseOptionId:chooseOptionId,
optionList:[{
pvoId:pvoId,
fillOptionContext: fillOptionContext
}]
};

$.ajax({
url: "/wx/doExamAnswer",
type: "POST",
data: JSON.stringify(param),
dataType: "json",
contentType: "application/json",
success: function (data) {
console.log(data);
},
error:function () {
}
});

Java代码:

1
2
3
4
5
6
7
8
9
10
@RequestMapping(value = "/wx/doExamAnswer", method = RequestMethod.POST)
@ResponseBody
public ResponseResult doExamAnswer(@RequestBody ExamAnswerForm examAnswerForm, HttpServletRequest request) {
//获取cookie
String openId = CookieUtil.getCookie(request, Constant.OPENID_COOKIE);

examService.doExamAnswer(examAnswerForm, openId);

return ResponseResult.build(ResponseCodeEnum.SUCCESS, "");
}

问题已解决

参考文档:

https://stackoverflow.com/questions/5900840/post-nested-object-to-spring-mvc-controller-using-json

https://blog.csdn.net/FreeNiuNiu/article/details/78806508

-------------已经触及底线 感谢您的阅读-------------

本文标题:SpringMVC后台接收Ajax传递复杂对象报错property path is neither an array nor a List

文章作者:趙小傑~~

发布时间:2019年11月06日 - 10:26:14

最后更新:2019年11月06日 - 21:52:44

原始链接:https://cnsyear.com/posts/ec71cea0.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

0%