如何将 ajax 中的 FormData 和 JSON 对象传递给 Spring MVC 控制器?

How to pass FormData and JSON object in ajax to Spring MVC Controller?

我需要在 ajax 调用中传递 FormData 和 JSON 对象,但我收到 400 Bad Request 错误。

[artifact:mvn]  org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver - Failed to read HTTP message: org.springframework.http.converter.HttpMessageNotReadableException: Could not read document: Unexpected character ('-' (code 45)) in numeric value: expected digit (0-9) to follow minus sign, for valid numeric value
[artifact:mvn]  at [Source: java.io.PushbackInputStream@3c0d58f6; line: 1, column: 3]; nested exception is com.fasterxml.jackson.core.JsonParseException: Unexpected character ('-' (code 45)) in numeric value: expected digit (0-9) to follow minus sign, for valid numeric value
[artifact:mvn]  at [Source: java.io.PushbackInputStream@3c0d58f6; line: 1, column: 3]

JS:

var formData = new FormData(form[0]);
//form JSON object
var jsonData = JSON.stringify(jcArray);
$.ajax({
        type: "POST",
        url: postDataUrl,
        data: { formData:formData,jsonData:jsonData },
        processData: false,
        contentType: false,
        async: false,
        cache: false,
        headers: { 
            'Accept': 'application/json',
            'Content-Type': 'application/json' 
        },
        success: function(data, textStatus, jqXHR) {
        }
});

控制器:

@RequestMapping(value="/processSaveItem",method = RequestMethod.POST")
public @ResponseBody Map<String,String> processSaveItem(
                                  @RequestBody XYZClass result[])

}

有类似的问题,jquery sending form data and a json object in an ajax call,我也在尝试同样的方法。

如何在单个 ajax 请求中同时发送 FormData 和 JSON 对象?

你可以这样通过

   postdata={};
   postdata.formData=formData;
   postData.jsonData=jsonData
 $.ajax({
    type: "POST",
    url: postDataUrl,
    data: { postdata},
    processData: false,
    contentType: false,
    async: false,
    cache: false,
    headers: { 
        'Accept': 'application/json',
        'Content-Type': 'application/json' 
    },
    success: function(data, textStatus, jqXHR) {
    }

});

和控制器端你可以识别数据。

我通过在 ajax POST.POST 中附加带有 FormData 对象的 JSON 字符串解决了这个问题。

var jsonObjectData = JSON.stringify(jcArray);
formData.append("jsonObjectData",jsonObjectData);

并且在控制器中,您可以像访问其他表单数据值一样以正常方式访问它。

request.getParameter("jsonObjectData");

现在您将拥有字符串化 JSON,您可以将 json 解析为 Java 对象

How to parse a JSON string to an array using Jackson.

您可以执行以下操作以在 Ajax 调用中传递表单数据。

var formData = $('#client-form').serialize();
$.ajax({
    url: 'www.xyz.com/index.php?' + formData,
    type: 'POST',
    data:{
    },
    success: function(data){},
    error: function(data){},
})