2014-11-14 33 views
1

我需要通过jQuery.ajax()向Spring MVC控制器URL映射方法发送请求并接收响应;请求和响应数据都是JSON格式。通过jQuery/ajax + JSON将ID和字符串数组传递给Spring MVC

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 (错误的请求)。所以,我在JSON.stringify'ed Ajax调用数组:

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响应是正确形成的。

+0

你必须了解的第一个和非常重要的事情,如果你是通过从JSON数据,你有相同的数据类型和模式....喜欢这里我创建的基础方法签名json data public PanelData getPanelsDataById(@RequestParam(“id”)BigDecimal id,@RequestParam(“panels”)列表 panelsList) – Sam 2014-11-14 20:20:48

回答

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) {...} 
}); 
+0

感谢@ RE350,为我工作。 – 2014-11-21 18:07:30

+0

如果我绝对不想创建一个新的类,下面的代码也适用于我 - 对于Ajax调用的选项,添加'traditional:true'和数据选项'data:$ .param({“id”: 1,“panels”:[“View1”,“View2”,“View3”]},true)'。 – 2014-11-21 18:12:57

+0

@WebUser非常有帮助,非常感谢这种方法以及问题。我想问一个问题,设置“传统:真实”,有害还是不安全? – swapyonubuntu 2015-03-09 15:10:30

相关问题