Spring MVC Ajax Post @ModelAttribute (отправить объект json в контроллер метода)

У меня проблема с отправкой объекта JSON в контроллер метода из javascript. Ниже приведен фрагмент кода javascript:

$.getJSON("/api/tasks/" + id)
.done(function( task ) {
  $.post("/tasks/update", {
      id: task.id,
      version: task.version,
      name: task.name,
      description: task.description,
      priority: task.priority,
      finished: task.finished,
      category: task.category
    });
});

И контроллер метода, который должен получить объект json

@PostMapping(path = "update")
public String processUpdateForm(@ModelAttribute @Valid Task task, BindingResult bindingResult) {
    if (bindingResult.hasErrors()) {
      return TASK_EDIT_FORM;
    }

    taskService.updateTask(task);

    return redirectTo("/tasks");

}

Проблема начинается, если я хочу отправить последнюю категорию свойств: task.category, которая является вложенным объектом, я получил следующую ошибку:

org.springframework.beans.InvalidPropertyException: Invalid property 'category[id]' of bean class [pl.java.learning.todolist.domain.task.Task]: Property referenced in indexed property path 'category[id]' is neither an array nor a List nor a Map; returned value was [Category(name=null)]

Я заметил, что метод не может обрабатывать категорию [id], которой, я полагаю, должна быть category.id? Я потратил на эту проблему несколько дней с большим количеством комбинаций (например, RequestBody, другая структура JSON (JSON.parse или JSON.stringify)), но без хороших результатов. Может быть, у кого-то была эта или похожая проблема, и он может дать мне совет, что мне делать?

С Уважением

Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
1
0
849
1

Ответы 1

Я нашел ответ на свою проблему, может быть, в будущем у кого-то появится подобное, поэтому я оставлю решение ниже:

Код фрагмента Javascript:

$.getJSON("/api/tasks/" + id)
.done(function(task) {
  $.ajax("/api/tasks", {
    data: JSON.stringify(task),
    contentType: 'application/json',
    type: 'POST'
  });
});

Фрагмент кода контроллера метода:

@PostMapping
  public void addTask(@RequestBody Task task) {
    taskService.addTask(task);
  }

Не знаю, хорошее ли это решение, но для моих целей пока достаточно.

С Уважением

Другие вопросы по теме