通过jQuery / ajax + JSON将ID和String数组传递给Spring MVC

时间:2014-11-14 19:22:56

标签: jquery ajax json spring-mvc

我需要通过jQuery.ajax()将请求发送到Spring MVC控制器URL映射方法并接收响应;请求和响应数据都是JSON格式。

Ajax调用将是这样的:

$.ajax({
    url: "/panelsData",
    dataType: "json",
    data: { "id": 1, "panels": [ "View1", "View2", "View3" ] },
    success: function(data) {...}
});

Spring MVC控制器URL映射方法:

@RequestMapping(value="/panelsData", method = RequestMethod.POST,
        produces = MediaType.APPLICATION_JSON_VALUE,
        consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseStatus(value=HttpStatus.OK)
@ResponseBody
public List<PanelData> getPanelsDataById(
         @RequestParam("id") BigDecimal id,
         @RequestParam("panels") List<String> panelsList) {

    // Process list of Strings corresponding to panel view names
    // and return a list of PanelData objects (in JSON format).
}

我遇到的第一个问题是客户端(浏览器)失败,错误代码为400(错误请求)。所以,我在ajax调用中JSON.stringify'ed数组:

data: { "id": 1, "panels": JSON.stringify([ "View1", "View2", "View3" ]) },

这一次,Spring MVC成功收到了请求。但是String值列表中存在一些问题。当我检查这些值时,这就是我所看到的:

panelsList[0] = ""[View1""
panelsList[1] = ""View2""
panelsList[2] = ""View3]""

什么?我期待着这些价值观:

panelsList[0] = "View1"
panelsList[1] = "View2"
panelsList[2] = "View3"

我是否错误地序列化(或反序列化)值?鉴于数据交换必须都是JSON,并且我正在使用Jackson库,我期望在JSON中从客户端接收ID和一个String值列表应该不是那么困难。我知道Jackson库配置是完美的,因为其他方法返回的JSON响应是正确形成的。

1 个答案:

答案 0 :(得分:3)

我认为如果您可以重构下面的代码会更好。

不是在单独的参数中传递/接收它们,而是可以创建PanelDataJson类,它包含id和面板列表。

class PanelDataJson{
    BigDecimal id;
    List<String> panelsList;

     //Getter and Setter

}

然后改变你的方法,如下所示。

@RequestMapping(value="/panelsData", method = RequestMethod.POST,
        produces = MediaType.APPLICATION_JSON_VALUE,
        consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseStatus(value=HttpStatus.OK)
@ResponseBody
public List<PanelData> getPanelsDataById(
         @RequestBody PanelDataJson) {

    // Process list of Strings corresponding to panel view names
    // and return a list of PanelData objects (in JSON format).
}

从前端开始,只需将整个数据进行字符串化,而不是部分。

$.ajax({
    url: "/panelsData",
    dataType: "json",
    data: JSON.stringify({ "id": 1, "panels": [ "View1", "View2", "View3" ] }),
    type: "POST",
    contentType : 'application/json; charset=utf-8',
    success: function(data) {...}
});