任务是保存重新排序的项目列表。
我的方法是将它们收集在一个稀疏数组中,进行字符串化处理并发布到服务器,然后在服务器中对其进行解析并映射到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插件。
答案 0 :(得分:1)
之所以得到这个Exception
,是因为后端map
是HashMap
/ Map<Integer, Integer>
,并且您传递了array
,而数组却没有key/value
对数据结构符合预期。
这里的解决方案是传递object
而不是array
,因此在JavaScript方面,只需将items
声明更改为object
:
var items = {};
您将拥有预期的数据类型。