Spring/JPA/Jackson 中的 Diff HTTP PUT 方法
Posted
技术标签:
【中文标题】Spring/JPA/Jackson 中的 Diff HTTP PUT 方法【英文标题】:Diff HTTP PUT method in Spring/JPA/Jackson 【发布时间】:2019-06-06 07:26:24 【问题描述】:我想知道在使用 PUT 方法更新存储在 DB 中的实体的特定属性时,最佳做法是什么。
让我们看看 Rest Controller 接收到的以下 json 示例:
"id":1, "surname":"Doe"
我们存储的实体看起来像这样:
public class Employee
Long id;
String name;
String surname;
Date createdAt;
Date updatedAt;
为了简单起见,我省略了注释。
我想要实现的是在 RestController 上我收到这样的信息:
@PutRequest
public Employee updateEmployee(@RequestBody Employee employee)
repo.saveAndFlush(employee);
因此,如果我这样做,那么 name
和时间戳的现有字段将设置为 null,因为提供的实体不包含此类字段。
我想知道是否有办法运行以下操作:
使用 DB 上提供的 ID 加载实体 更新 Json/请求正文中提供的字段。 保持更新的实体 -> 这可以按照我在代码中显示的相同方式完成。我知道它存在 @JsonIdentity 和 @JsonIdentifyreference(alwaysAsId=true) ,我将它们与解析器一起使用以从数据库中获取数据以获取仅提供 ID 而不是实体本身的嵌套实体。
【问题讨论】:
【参考方案1】:PATCH
方法专为该功能而设计。
在替换整个资源时应使用PUT
- 这意味着在您未在请求中提供的字段上设置null
。
PATCH
用于更新资源,您可以更新单个字段或所有字段,您可以选择。
请注意,实际的数据库更新可能不会自动进行,因为您更改了 HTTP 方法。对于 Hibernate,有一个 @DynamicUpdate
提供相同的功能。如果没有@DynamicUpdate
,设置为null
的字段将被更新,但如果使用@DynamicUpdate
,则只会更新被修改的字段。
【讨论】:
更准确地说,patch 是服务器应该对某些资源应用以将资源状态转换为所需状态的一组指令。正如William Durand 所提到的,使用JSON Merge Patch format 可能是很多人认为通过PUT 或PATCH 完成部分更新的最接近的事情。以上是关于Spring/JPA/Jackson 中的 Diff HTTP PUT 方法的主要内容,如果未能解决你的问题,请参考以下文章