2014-11-14 67 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

相關問題