首页 > 解决方案 > Spring Boot REST - 如何以多对多关系发布/修补

问题描述

我在 REST api 中添加多对多关系时遇到问题。

假设我们有两个具有多对多关系的实体 - Employee 和 Task(employee haveSet<Task>和 task have Set<Employee>)。

可以通过此端点访问某些特定任务:

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

分配给 id 为 88 的员工的任务可通过以下方式访问:

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

目标是将此链接发布/修补到端点。

你能给我一个提示,这个端点在控制器中应该是什么样子? 我尝试过这样的事情,但它不起作用。

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

第二个问题- 我会链接到使用 Postman。你能告诉我应该选择哪种 Content-Type 吗?这个链接应该如何格式化?

期待您的回答!

编辑

我是否必须添加另一个接受 uri 的构造函数?

标签: springspring-bootrestspring-data-jpaspring-rest

解决方案


根据定义,PATCH 方法对给定资源应用部分更新,而 PUT 方法用于完全替换给定资源。这里的关键字是 PATCH 和 PUT 都是特定于给定资源的。POST 方法用于创建新资源。

因此,如果您只想更新资源中的几个字段并且不需要完全更新它,那么使用 PATCH 方法而不是 PUT 方法是有意义的。

PATCH 请求正文描述了如何通过一系列操作更新资源。您可以用来描述这些操作的一种格式是 JSON Patch。

由于 PATCH 操作特定于给定资源,并且使用 json-patch 库,因此您的控制器方法应该类似于:

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

请注意,这与 POST 不同,使用不同的方法 (updateTask)。例如,如果您想从任务资源中更新一个字段(由 taskId 给出),您的客户端(可以是 Postman)在请求正文中发送的 jsonPatch 将类似于

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

有不同的操作,例如添加、删除、替换、复制和测试。

现在在您的代码中,您需要将此补丁应用到现有资源。该参考资料显示了如何做到这一点:

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

我希望这有帮助。


推荐阅读