2013-03-23 74 views
3

我有串在我的javascript代碼清單,我通過JQuery發送到一個基於REST的服務如下:轉換JSON數組轉換成Java列表<String>與Spring MVC

var ids = []; 
$("input:checked").each(function() { 
    ids.push(this.id); 
}); 
var selectedIds = JSON.stringify(ids); 
$.post("/todonotes/tasks/removeTask", selectedIds,function(e) { 
}, "json"); 

正如你所看到的,我轉換一個JavaScript數組放入JSON數組中。現在

,在服務器端,我使用Spring MVC和傑克遜接收並解析輸入JSON:

@RequestMapping(value="/tasks/removeTask", method = RequestMethod.POST) 
public @ResponseBody String removeTask(@RequestBody List<String> selectedIds) { 
    ... 
} 

但我總是得到:

HTTP Status 415 - 

-------------------------------------------------------------------------------- 

type Status report message 

description The server refused this request because the request entity is in a format  not supported by the requested resource for the requested method. 

我試圖刪除引號來自JSON對象,並嘗試使用@RequestParam而沒有成功。

更新爲每OQJF建議:

我修改後要求如下:

$.post("/todonotes/tasks/removeTask", {selectedIds: selectedIds},function(e) { 
}, "json"); 

現在我的控制器方法被調用,但每個List元素填充了雙引號和括號。這個列表參數:

[["15", "21"]] 

例如,第一元素的樣子:

["15" 

我寧願不要解析List的每個String元素。

我也嘗試刪除JSON.stringify轉換,但我的控制器甚至沒有被調用。有了這個,我得到了:

HTTP Status 400 - Required List parameter 'selectedIds' is not present 

-------------------------------------------------------------------------------- 

type Status report 

message Required List parameter 'selectedIds' is not present 

description The request sent by the client was syntactically incorrect. 

更新

我試圖創建一個對象來保存我的ID,如下所示:

public class TaskIdHolder { 

    private String[] selectedIds; 

    public String[] getSelectedIds() { 
     return selectedIds; 
    } 

    public void setSelectedIds(String[] selectedIds) { 
     this.selectedIds = selectedIds; 
    } 
} 

然後我修改我的控制器方法簽名:

public @ResponseBody String removeTask(@RequestBody TaskIdHolder selectedIds) { 

而我的JSON請求如下所示:

{"selectedIds":["15"]} 

我也修改了我的jQuery代碼按安德烈的建議:

var data = JSON.stringify({selectedIds:selectedIds}); 
$.post("/todonotes/tasks/removeTask", data, function(e) { 

凡selectedIds是一個JavaScript陣列。

但現在我得到:

POST http://localhost:8080/todonotes/tasks/removeTask 415 (Unsupported Media Type) 
+1

可能是http://stackoverflow.com/questions/11492325/post-json-fails-with-415-unsupported-media-type-spring-3-mvc可以幫助你更新的問題。 – 2013-03-23 16:02:46

+0

在這篇文章中的解決方案之一已爲我工作。謝謝。 – 2013-03-24 18:14:40

+0

很高興知道:) – 2013-03-24 19:57:43

回答

2

試着給請求參數一個明確的名稱:

$.post("/todonotes/tasks/removeTask", {selectedIds: selectedIds},... 

更新。您也可以嘗試到整個請求數據對象字符串化到JSON:

var data = {selectedIds: selectedIds}; 
$.post("/todonotes/tasks/removeTask", JSON.stringify(data),... 
+0

謝謝。取得了一些進展。我仍然有一些與List參數有關的問題。請看我更新的問題。 – 2013-03-23 13:48:37

+0

@GonzaloGarciaLasurtegui,請看看更新的答案 - 這應該有所幫助。 – Andrei 2013-03-23 13:59:52

+0

我用@RequestBody註解試過這個。請在我的問題中看到新的更新。 – 2013-03-23 15:36:44

4

據我所知,你不需要使用JSON.stringify(),你的代碼可以是這樣的:

var ids = []; 
$("input:checked").each(function() { 
    ids.push(this.id); 
}); 

$.post("/todonotes/tasks/removeTask", $.param({'id': ids}, true),function(e) { 
}, "json"); 

而且在服務器端,您應該指定的值:

public methodName(@RequestParam("id") List<String> selectedIds) 
3

嘗試以下,沒有必要改變你的控制器的方法簽名或創建一個對象來保存你的ID。

$.post("/todonotes/tasks/removeTask", {selectedIds: selectedIds.join(',')},function(e) { 
}, "json"); 

這樣,您要發送您的ID,如selectedIds: id1,id2,id3這是控制器是如何期待他們,如果你宣佈你的請求參數去是String[]List<String>(適用於這兩種情況)。