Из того, что я искал и нашел, что это очень хорошо, возможно, не удастся, но любая помощь будет оценена.
У меня есть контроллер весны, который принимает DTO, который я создал, и одним из атрибутов является Map. На моей странице html я пытаюсь связать карту со страницы в JSON, но единственный способ, которым я нашел это, - преобразовать карту в массив. Это приводит к сбою десериализации из-за несовместимых типов.
НАПРИМЕР
контроллер:
@PostMapping("/mapping")
public ResponseEntity addThing(@Validated @RequestBody Dto dto, BindingResult result){
//Do some stuff
}
Dto:
public class Dto {
...
private Map<Integer, String> map;
...
}
Javascript:
...
var map = new Map();
$("#mapBody tr").map(function () {
var value = $(this).find( "input[name=value]").val();
var index = $(this).find("input[name=index]").val();
map.set(index, value);
});
...
var data = {
//other values
"map": Array.from(map.entries()), //This is what I have found so far but
//this is what I believe needs to be changed
//Some more values
}
...
$.ajax({
url: "/mapping",
type: "POST",
data: JSON.stringify(data),
...
});
Как упоминалось выше, изменение в массив приводит к отказу десериализации, но в противном случае stringify делает карту просто: {}, которую я знаю, является ожидаемым поведением.
В любом случае, я могу изменить это, чтобы заставить его делать то, что я бы хотел?
EDIT: Это результат строки с помощью Array.from()
"{
//values
"map":[["0","value"],["1","another value"],["2","third value"]],
//more values
}"
И, как я уже упоминал выше, если я просто использую "карту": map, то получившийся разбор будет "map": {}
Я просто немного подумал о вашей проблеме. Мы не можем корректно сериализовать JS Map()
(проблемы с сериализацией карты JS), поэтому мой предлог заключается в том, чтобы изменить код следующим образом:
...
var map = {}; // using object instead of map
$("#mapBody tr").map(function () {
var value = $(this).find( "input[name=value]").val();
var index = $(this).find("input[name=index]").val();
map[index] = value; // setting property of object
});
...
var data = {
//other values
"map": map, // using map object instead of array
//Some more values
}
...
$.ajax({
url: "/mapping",
type: "POST",
data: JSON.stringify(data),
...
});
Таким образом, JSON выглядит следующим образом:
'{"id":1,"map":{"1":"val1","2":"val2","3":"val3"},"otherProperty":"otherValue"}'
И этот параметр можно разделить на DTO с HashMap<Integer, String> map
внутри. Попробуйте, пожалуйста, и дайте мне знать, если это сработает.