Spring Boot REST - как выполнить POST / PATCH в отношениях "многие ко многим" - PullRequest
0 голосов
/ 21 июня 2020

У меня проблема с добавлением отношения «многие ко многим» в моем REST api.

Допустим, у нас есть две сущности с отношением «многие ко многим» - Сотрудник и Задача (у сотрудника есть Set<Task> и задача имеет Set<Employee>).

Некоторые определенные задачи c доступны через эту конечную точку:

http://localhost:8080/api/tasks/2

Доступны задачи, назначенные сотруднику с идентификатором 88 через:

http://localhost:8080/api/employees/88/tasks

Цель состоит в том, чтобы отправить / ПАТЧИРОВАТЬ эту ссылку на конечную точку.

Не могли бы вы дать мне подсказка, как эта конечная точка должна выглядеть в контроллере? Я пробовал что-то подобное, но это не работает.

@PatchMapping("/{employeeId}/tasks")
public Task addTask(@RequestBody Task task, @PathVariable Long taskId) { ... }

Вторая проблема - Я бы связал почтальоном. Не могли бы вы сказать мне, какой Content-Type мне выбрать? И как отформатировать эту ссылку?

Жду ваших ответов!

РЕДАКТИРОВАТЬ

Нужно ли мне добавлять еще один конструктор, который принимает uri?

1 Ответ

0 голосов
/ 21 июня 2020

По определению метод PATCH применяет частичное обновление к данному ресурсу, в то время как метод PUT используется для замены данного ресурса полностью . Ключевым словом здесь является то, что и PATCH, и PUT указаны c для данного ресурса. Метод POST используется для создания нового ресурса.

Следовательно, имеет смысл, если вы хотите обновить только несколько полей в своем ресурсе, и вам не нужно его обновлять полностью, чтобы использовать метод PATCH вместо метода PUT.

Тело запроса PATCH описывает, как должен быть обновлен ресурс, с помощью ряда операций. Один из форматов, который вы можете использовать для описания этих операций, - это JSON Patch.

Поскольку операция PATCH специфицируется c для данного ресурса и с использованием библиотеки json -patch, ваш Метод контроллера должен выглядеть примерно так:

@PatchMapping("/{employeeId}/tasks/{taskId}")
public Task updateTask(@RequestBody JsonPatch taskPatch, @PathVariable Long employeeId, @PathVariable Long taskId) { ... }

Обратите внимание, что это отличается от POST, с другим методом (updateTask). Например, если вы хотите обновить одно поле из вашего ресурса задачи (заданного taskId), ваш jsonPatch, отправленный в теле запроса от вашего клиента (может быть Postman), будет выглядеть примерно так:

[{
   "op":"replace",
   "path":"/field",
   "value":"newValue"
}]

различные операции, такие как добавление, удаление, замена, копирование и проверка.

Теперь в вашем коде вам нужно будет применить этот патч к существующему ресурсу. В этой справке показано, как это сделать:

https://www.baeldung.com/spring-rest-json-patch

Надеюсь, это поможет.

...