java - Spring/JPA/Jackson 中的差异 HTTP PUT 方法

标签 java spring-boot jackson spring-data-jpa

我想知道使用 PUT 方法更新存储在数据库中的实体的特定属性时的最佳实践是什么。

让我们看看 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,因为提供的实体不包含此类字段。

我想知道是否有办法运行以下操作:

  • 使用数据库上提供的 ID 加载实体
  • 更新 Json/请求正文中提供的字段。
  • 保留更新后的实体 -> 这可以按照我在代码中所示的相同方式完成。

我知道它存在 @JsonIdentity 和 @JsonIdentifyreference(alwaysAsId=true),我将它们与解析器结合使用从数据库中获取数据,以获取仅提供 ID 而不是实体本身的嵌套实体。

最佳答案

PATCH 方法是为该功能而设计的。

当您替换整​​个资源时,应使用

PUT - 这意味着在请求中未提供的字段上设置 null

PATCH 用于更新资源,您可以更新单个字段,也可以更新所有字段,您可以选择。

请注意,实际的数据库更新可能不会自动工作,只是因为您更改了 HTTP 方法。对于 Hibernate,有一个 @DynamicUpdate 提供相同的功能。如果没有 @DynamicUpdate,设置为 null 的字段将被更新,但如果使用 @DynamicUpdate,则仅更新已修改的字段。

关于java - Spring/JPA/Jackson 中的差异 HTTP PUT 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54145407/

相关文章:

java - Android,在DIALOG中点击 "ok"后重新加载或刷新当前 fragment

java - 使用 Jackson 将 XML 反序列化为 Java 对象

javascript - 如何使用嵌套组件对组件进行快照测试?

java - 我们如何根据 spring-boot 或 java 或 python 中的资源文件中的动态变量检索文本响应

java - Spring JPA 不为实体创建表

HTTPS 连接不起作用 [Spring Boot]

java - 这是 Jackson JsonParser 中的错误,还是我做错了什么?

java - 什么时候以及为什么使用枚举是有用的?

java - 当 csv 中第二列的值与 java 中的用户输入匹配时,获取 csv 文件中的一行

java - jOOQ - 多重绑定(bind)