【问题标题】:Converting JSON array into java List<String> with Spring MVC使用 Spring MVC 将 JSON 数组转换为 java List<String>
【发布时间】:2013-03-13 07:17:01
【问题描述】:

我的 javascript 代码中有一个字符串列表,我通过 JQuery 将其发送到基于 REST 的服务,如下所示:

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 和 Jackson 来接收和解析输入的 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 元素都填充了双引号和括号。这是 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"]}

我还按照 Andrei 的建议修改了我的 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) 

【问题讨论】:

标签: jquery json spring-mvc


【解决方案1】:

据我所知,您不需要使用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)

【讨论】:

    【解决方案2】:

    尝试以下操作,无需更改控制器的方法签名或创建对象来保存您的 id。

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

    这样,您将发送像 selectedIds: id1,id2,id3 这样的 ID,如果您将请求参数声明为 String[]List&lt;String&gt;(适用于这两种情况),这就是控制器期望它们的样子。

    【讨论】:

      【解决方案3】:

      尝试为请求参数指定一个明确的名称:

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

      更新。您还可以尝试将整个请求数据对象字符串化为 JSON:

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

      【讨论】:

      • 谢谢。取得了一些进展。我仍然对 List 参数有一些问题。请更新我的问题。
      • @GonzaloGarciaLasurtegui,请查看更新后的答案 - 这应该会有所帮助。
      • 我用@RequestBody 注释试过这个。请在我的问题中查看新的更新。
      猜你喜欢
      • 1970-01-01
      • 2015-06-05
      • 2021-09-17
      • 2017-12-25
      • 2019-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多