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


    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代码:

    var param = {
        pvqId:pvqId,
        chooseOptionId:chooseOptionId,
        optionList:[{
            pvoId:pvoId,
            fillOptionContext: fillOptionContext
        }]
    };
    
    $.post("/wx/doExamAnswer", param, function (data) {
        console.log(data);
    }, "json");
    
    

    Java代码:

    @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参数映射成这样:

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

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

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

    三、解决方案

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

    JS代码:

    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代码:

    @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

  • 相关阅读:
    第一次迭代心得
    RDF搜索引擎——需求分析心得
    RDF搜索引擎——数据库设计心得
    RDF搜索引擎——数据库具体设计
    服务器上修改运行scala
    结对编程项目的收获与总结(支持UI背景与背景音乐的刷题器)
    取长补短——结对编程项目之队友代码分析
    团队项目——测试心得
    第一次迭代开发心得
    团队项目——需求心得
  • 原文地址:https://www.cnblogs.com/cnsyear/p/12732014.html
Copyright © 2020-2023  润新知