使用部分更新在REST中实现PATCH方法的官方方法

Dan*_*ton 7 rest hibernate http-method spring-boot spring-rest

我绝对没有找到完全自动进行部分更新的明确方法(可以通过比较数据库和部分对象中的逐字段对象来实现)。

我看到了一些类似的曲目:

  • 在这里,但我不知道它的魔力是什么MapperService
  • 在这里,但是非常丑陋,我确信存在更好的解决方案
  • 在这里,但我不知道使用heavyResourceRepository哪种save(Map<String, Object> updates, String id)方法的存储库类型是什么
  • 还是可以/必须使用ModelMapper映射不为null的字段?
  • 这里的覆盖copyProperty方法

谢谢您,可以使用PATCH方法,但是我看不到实现它的明确方法。

Aro*_*ter 1

您可以使用 @RepositoryRestResource 来为您做到这一点。

当您像这样导出端点时:

@RepositoryRestResource(path = "some_entity")
public interface SomeEntityRespostiory extends JpaRepository<SomeEntity, Integer> {

}
Run Code Online (Sandbox Code Playgroud)

您将公开默认 CRUD 的所有选项,并且不需要控制器类。

您可以使用 PUT 替换所有实体字段。或者您可以使用 PATCH 来替换实体中的某些字段。

此 PATCH 方法将负责仅更新您实际从负载中收到的字段。

例如:

@Entity
@Getter
@Setter
@NoArgsContructor
public classe SomeEntity {

    @Id
    private Integer id;
    private String name;
    private String lastName;
    private LocalDate birthDate;
    private Integer phoneNumber;
}
Run Code Online (Sandbox Code Playgroud)

为您创建您的寄存器:

curl -i -X POST -H "Content-Type:application/json" -d 
'{"name": "Robert", "lastName": "Downey", "bithDate": "1965-4-4", "phoneNUmber":2025550106}'
http://localhost:8080/some_entity
Run Code Online (Sandbox Code Playgroud)

要替换您使用的所有记录:

curl -i -X PUT -H "Content-Type:application/json" -d 
'{"name": "Robert", "lastName": "Downey", "bithDate": "1965-4-4"}'
http://localhost:8080/some_entity/{id}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,变量“phoneNumber”将为空。

但是,如果你尝试这样做:

curl -i -X PATCH -H "Content-Type:application/json" -d 
'{"lastName": "Downey Jr.", "bithDate": "1965-4-15"}'
http://localhost:8080/some_entity/{id}
Run Code Online (Sandbox Code Playgroud)

仅更新“lastName”和“birthDate”。

这太棒了,因为您不必担心它。

您可以在本文档中查看更多相关信息。搜索单词“Patch”,您可以找到一些示例。

如果您需要进行一些验证,例如:名称至少需要三个单词。你可以像这样放置一个EventHandler:

curl -i -X POST -H "Content-Type:application/json" -d 
'{"name": "Robert", "lastName": "Downey", "bithDate": "1965-4-4", "phoneNUmber":2025550106}'
http://localhost:8080/some_entity
Run Code Online (Sandbox Code Playgroud)

然后你可以抛出异常,或者将所有字符串更改为大写字符串,或者你想要的任何其他内容。