我在 REST API 中添加多对多关系时遇到问题。
假设我们有两个具有多对多关系的实体 - 员工和任务(员工有Set<Task>
,任务有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) { ... }
第二个问题- 我会链接使用邮递员。你能告诉我我应该选择哪种内容类型吗?这个链接应该如何格式化?
期待您的回答!
编辑
我是否必须添加另一个需要 uri 的构造器?
根据定义,PATCH 方法对给定资源应用部分更新,而 PUT 方法用于完全替换给定资源。这里的关键词是 PATCH 和 PUT 都特定于给定资源。 POST 方法用于创建新资源。
因此,如果您只想更新资源中的几个字段,并且不需要完全更新它,请使用 PATCH 方法而不是 PUT 方法是有意义的。
PATCH 请求正文通过一系列操作描述如何更新资源。可用于描述这些操作的一种格式是 JSON 修补程序。
由于 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
我希望这有所帮助。