Javascript 如何使用Ajax调用将列表传递给Spring MVC控制器

Javascript 如何使用Ajax调用将列表传递给Spring MVC控制器,javascript,ajax,spring-mvc,Javascript,Ajax,Spring Mvc,我的持有对象如下: public class Transfer implements Serializable { private Integer transferId; private Integer transferTypeId; private String storeId; private String userId; private Integer titleId; private Integer statusId;

我的持有对象如下:

public class Transfer implements Serializable {
     private Integer transferId;
     private Integer transferTypeId;
     private String storeId;
     private String userId;
     private Integer titleId;
     private Integer statusId;
     private String inWorkerId;
     private String outWorkerId;
     private Date createDt;
     private Date updateDt;
     // getters & setts
 }
我有var
reqRow
,需要发送给控制器

function onClickSave(){
    var rows = $('#transferEditGrid').jqGrid('getRowData');
    var reqRow = [];
    for (i = 0; i < rows.length; i++)
    {
        var rowObj = {};
        rowObj.storeId = rows[i].storeId;
        rowObj.inWorkerId = rows[i].inWorkerId;
        rowObj.outWorkerId = rows[i].outWorkerId;
        rowObj.transferTypeId = rows[i].transferTypeId;
        rowObj.statusId = rows[i].statusId;
        rowObj.storeId = rows[i].storeId;
        reqRow.push(rowObj);
    }

    //send reqRow to the Controller
    $.ajax({
        type:'POST',
        url:'${contextPath}/resource-transfer/update.do',
        dataType:"json",
        data : {rows : reqRow},
        //data:JSON.stringify(reqRow),
        success:function(response){
            alert("success");

        }
    });
}
函数onClickSave(){
var rows=$('#transferditgrid').jqGrid('getRowData');
var reqRow=[];
对于(i=0;i
控制器如下所示:

@RequestMapping(value = "/update", method = { RequestMethod.GET, RequestMethod.POST }, produces = "application/json; charset=utf-8")
@ResponseBody
public String transferUpdate(@RequestBody List<Transfer> rows) throws JSONException, InterruptedException {

    System.out.println("in transfer update section");

    return null;
}
@RequestMapping(value=“/update”,method={RequestMethod.GET,RequestMethod.POST},products=“application/json;charset=utf-8”)
@应答器
公共字符串transferUpdate(@RequestBody List rows)抛出JSONException、InterruptedException{
System.out.println(“在传输更新部分”);
返回null;
}
为什么我不能将数组对象传递给控制器? 我是否误解了Ajax调用的用法

多谢各位

  • 首先,将列表包装到另一个java对象

    public class TransferDTO {
       private List<Transfer> rows;
       // getter & setter
     }
    
    公共类传输到{
    私有列表行;
    //吸气剂和塞特
    }
    
  • 在端点的
    列表
    中使用此选项

  • publicstringtransferupdate(@RequestBody TransferDTO data)

  • 在AJAX帖子中指定
    contentType
  • contentType:'application/json'

  • 手动字符串化数据
  • data:JSON.stringify({rows:reqRow})
    Java代码

    @Controller
    public class ContractController {
    
        @RequestMapping(value="all/contract/change/detail", method = RequestMethod.POST, produces=MediaType.APPLICATION_JSON_VALUE)
        @ResponseBody
        @ResponseStatus(HttpStatus.OK)
        public List<ContractAndBidReceiveChangeDetailModel> getAllContractAndBidReceiveChangeDetail(@RequestBody List<ContractReceivedChangedActivityCodesModel> allChangedActivityCodesModel) {
    
            List<ContractAndBidReceiveChangeDetailModel> allContractAndBidChangeDetails = null;
    
            if (CollectionUtils.isNotEmpty(allChangedActivityCodesModel)) {
                allContractAndBidChangeDetails = allChangedActivityCodesModel
                        .stream()
                        .map(this::getContractAndBidReceiveChangeDetail)
                        .collect(Collectors.toList());
            }
    
            return allContractAndBidChangeDetails;
        }
    } // end of controller class
    
    @JsonAutoDetect(
        creatorVisibility = JsonAutoDetect.Visibility.NONE,
        fieldVisibility = JsonAutoDetect.Visibility.NONE,
        getterVisibility = JsonAutoDetect.Visibility.NONE,
        isGetterVisibility = JsonAutoDetect.Visibility.NONE,
        setterVisibility = JsonAutoDetect.Visibility.NONE
    )
    public class ContractReceivedChangedActivityCodesModel {
    
        private String rowId;
        private Long bidId;
        private Long planId;
        private Long optionCodeId;
        private Long activityCodeId;
        private Long activityPackageId;
        private String activityCodeNoAndName;
        private String planName;
    
        // constructors
    
        @JsonProperty
        public String getRowId() {
            return rowId;
        }
    
        public void setRowId(String rowId) {
            this.rowId = rowId;
        }
    
        //others getters and setters
    }
    
    @控制器
    公共类控制器{
    @RequestMapping(value=“all/contract/change/detail”,method=RequestMethod.POST,products=MediaType.APPLICATION\u JSON\u value)
    @应答器
    @ResponseStatus(HttpStatus.OK)
    公共列表getAllContractAndBidReceiveChangeDetail(@RequestBody List AllChangedActivityCodes模型){
    列出所有ContractAndBidChangeDetails=null;
    if(CollectionUtils.isNotEmpty(allChangedActivityCodesModel)){
    allContractAndBidChangeDetails=allChangedActivityCodesModel
    .stream()
    .map(此::getContractAndBidReceiveChangeDetail)
    .collect(Collectors.toList());
    }
    返回所有ContractandBidChangeDetails;
    }
    }//控制器类结束
    @JsonAutoDetect(
    creatorVisibility=jsonautodect.Visibility.NONE,
    fieldVisibility=jsonautodect.Visibility.NONE,
    GettServiceability=jsonautodect.Visibility.NONE,
    IsGettServiceability=jsonautodect.Visibility.NONE,
    setterVisibility=jsonautodect.Visibility.NONE
    )
    公共类ContractReceivedChangedActivityCodes模型{
    私有字符串rowId;
    私人长柄;
    私人长平面;
    私人长期权;
    私有长活动代码;
    私有长活动包ID;
    私有字符串activityCodeNoAndName;
    私有字符串名称;
    //建设者
    @JsonProperty
    公共字符串getRowId(){
    返回rowId;
    }
    public void setRowId(字符串rowId){
    this.rowId=rowId;
    }
    //其他人则是能手和二传手
    }
    
    JQuery代码。确保您所做的json请求与spring所期望的相同。Spring会自动将这个json映射到您的java列表

    function getDetailRow(url, requestData, $caret, action) {
    
        $spinner.show();
    
        $.ajax({ 
            url: url, 
            data : requestData,
            dataType: "json",
            type: "POST",
            contentType: "application/json",
            success: function(response) {
                if (!$.isEmptyObject(response)) {
                    switch(action){
                        case "expandLink":
                            insertDetailRow($caret, response);
                        break;
                        case "expandAllLinks":
                            $.each(response, function(index, changeDetailResponse) {
                                var caretId = changeDetailResponse.rowId;
                                let $caret = $('#' + caretId);
                                insertDetailRow($caret, changeDetailResponse);  
                            });
                        break;
                    }
                } 
                $spinner.hide();
            }, error: function(xhr, status, error){
                $spinner.hide();
                if (xhr.status == 500) {
                    var errorResponse = xhr.responseText;
                    if (errorResponse) {
                        alert(errorResponse);
                    }
                }
            }
        });
    }
    
    function getRequestJson(requestObject) {        
        let requestJson = null;
        if (requestObject != null) {
            requestJson = JSON.stringify(requestObject);
        }
        return requestJson;
    }
    
    function getRequestObject($caret) {
        let requestObject = null;
        if ($caret.length > 0) {
            let rowId = $caret.attr("id");
            let bidId = $caret.attr("bidId");
            let planId = $caret.attr("planId");
            let optionCodeId = $caret.attr("optionCodeId");
            let activityCodeId = $caret.attr("activityCodeId");
            let activityPackageId = $caret.attr("activityPackageId");
    
            requestObject = new Object();
            requestObject.rowId = rowId;
            requestObject.bidId = bidId;
            requestObject.planId = planId;  
            requestObject.optionCodeId = optionCodeId;
            requestObject.activityCodeId = activityCodeId;
            requestObject.activityPackageId = activityPackageId;    
        }
        return requestObject;
    }
    
    let caretsWithoutDetailRow = new Array();
    let requestObjects = null;
    
    // process caretsWithoutDetailRow Array with some logic so it contains some elements
    
    if (caretsWithoutDetailRow.length > 0) {
        requestObjects = new Array();
        $.each(caretsWithoutDetailRow, function(index, $caret) {
            let requestObject = getRequestObject($caret);
            requestObjects.push(requestObject);
        });
    }
    
    if (requestObjects != null && requestObjects.length > 0) {
        let requestObjectsJson = getRequestJson(requestObjects);
        let url = '<c:url value = "/all/contract/change/detail"/>';
        getDetailRow(url, requestObjectsJson, null, 'expandAllLinks');
    }
    
    函数getDetailRow(url、requestData、$caret、action){ $spinner.show(); $.ajax({ url:url, 数据:请求数据, 数据类型:“json”, 类型:“POST”, contentType:“应用程序/json”, 成功:功能(响应){ 如果(!$.isEmptyObject(响应)){ 开关(动作){ 案例“expandLink”: insertDetailRow($caret,response); 打破 案例“expandAllLinks”: $.each(响应、函数(索引、changeDetailResponse){ var caretId=changetailresponse.rowId; 设$caret=$('#'+caretId); insertDetailRow($caret,changeDetailResponse); }); 打破 } } $spinner.hide(); },错误:函数(xhr,状态,错误){ $spinner.hide(); 如果(xhr.status==500){ var errorResponse=xhr.responseText; 如果(错误响应){ 警报(错误响应); } } } }); } 函数getRequestJson(requestObject){ 让requestJson=null; if(requestObject!=null){ requestJson=JSON.stringify(requestObject); } 返回请求JSON; } 函数getRequestObject($caret){ 让requestObject=null; 如果($caret.length>0){ 设rowId=$caret.attr(“id”); 设bidId=$caret.attr(“bidId”); 设planId=$caret.attr(“planId”); 让optionCodeId=$caret.attr(“optionCodeId”); 让activityCodeId=$caret.attr(“activityCodeId”); 让activityPackageId=$caret.attr(“activityPackageId”); requestObject=新对象(); requestObject.rowId=rowId; requestObject.bidId=bidId; requestObject.planId=planId; requestObject.optionCodeId=optionCodeId; requestObject.activityCodeId=activityCodeId; requestObject.activityPackageId=activityPackageId; } 返回请求对象; } let caretsWithoutDetailRow=新数组(); 让requestObjects=null; //p