如何发布数字到数字的地图?

时间:2018-12-12 14:34:46

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

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

我的方法是将它们收集在一个稀疏数组中,进行字符串化处理并发布到服务器,然后在服务器中对其进行解析并映射到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到0、5到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插件。

1 个答案:

答案 0 :(得分:1)

之所以得到这个Exception,是因为后端mapHashMap / Map<Integer, Integer>,并且您传递了array,而数组却没有key/value对数据结构符合预期。

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

var items = {};

您将拥有预期的数据类型。