Как разместить карту номеров к номерам? - PullRequest
0 голосов
/ 12 декабря 2018

Задача состоит в том, чтобы сохранить переупорядоченный список элементов.

Мой подход состоит в том, чтобы собрать их в разреженный массив, преобразовать в строку и отправить на сервер, где они должны быть проанализированы и сопоставлены с полем 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: невозможно десериализовать экземпляр java.util.LinkedHashMap из маркера START_ARRAY; вложенное исключение - com.fasterxml.jackson.databind.exc.MismatchedInputException: Невозможно десериализовать экземпляр java.util.LinkedHashMap изтокена START_ARRAY \ n в [Source: (PushbackInputStream);

Для переупорядочивания элементов UX я использую jsGrid + jQuery UI Sortable плагин.

1 Ответ

0 голосов
/ 12 декабря 2018

Вы получаете это Exception, потому что в вашем бэкэнде map является HashMap / Map<Integer, Integer>, и вы передаете array, в то время как массивы не являются парной структурой данных key/value, как ожидалось.

Решение здесь состоит в том, чтобы передать object вместо array, поэтому в вашей стороне JavaScript просто измените объявление items на object:

var items = {};

И у вас будет ожидаемый тип данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...