【问题标题】:How to POST a map of numbers to numbers?如何将数字映射发布到数字?
【发布时间】:2018-12-12 14:34:46
【问题描述】:

任务是保存重新排序的项目列表。

我的方法是将它们收集在一个稀疏数组中,将它们字符串化并发布到服务器,在那里它们应该被解析并映射到 DTO 字段,并在 Spring MVC 控制器中进行处理。但是我的代码不起作用。请看一下。

前端代码:

var items = [];
$.each($gridData.find("tr"), function (index, row) {
    items[$(row).data("JSGridItem").id] = index;
});

console.log("items", items);
// prints to console:
// items (6) [empty × 4, 0, 1]
// 4: 0
// 5: 1

$.post({
    contentType: "application/json; charset=utf-8",
    dataType: 'json',
    data: JSON.stringify({
        map: items
    }),
    url: "/items/reordering"
});

请求负载示例:map: [null, null, null, null, 0, 1]。由此我希望在后端得到一张 {4 to 0, 5 to 1} 的地图。

后端代码

@lombok.Data
public class ItemsOrderingDto {
    /** map of ID to order */
    @NotEmpty
    private Map<Integer, Integer> map = new HashMap<>();
}

@PostMapping("/items/reordering")
public ResponseEntity changeOrder(
        @RequestBody @Valid ItemsOrderingDto itemsOrdering
) {
    // ... save new order
    return ResponseEntity.ok().build();
}

但我收到错误 400 - 错误请求。

“JSON 解析错误:无法从 START_ARRAY 令牌中反序列化 java.util.LinkedHashMap 的实例;嵌套异常是 com.fasterxml.jackson.databind.exc.MismatchedInputException:无法从 START_ARRAY 令牌中反序列化 java.util.LinkedHashMap 的实例\n 在 [来源:(PushbackInputStream);

对于重新排序 UX 的项目,我使用 jsGrid + jQuery UI Sortable 插件。

【问题讨论】:

  • 将您的items 变量声明为object,就像这样var items = {};
  • @chŝdk 你的建议是正确的;我一分钟前自己修好了。请发表您的评论作为答案。

标签: javascript java jquery spring-mvc spring-boot


【解决方案1】:

你得到这个Exception是因为在你的后端map是一个HashMap/Map&lt;Integer, Integer&gt;并且你传递了一个array,而数组不是一个key/value对数据结构的预期。

这里的解决方案是传递object 而不是array,因此在您的JavaScript 端只需将items 声明更改为object

var items = {};

您将获得预期的数据类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-31
    • 2012-01-23
    • 2017-01-31
    • 1970-01-01
    • 2018-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多