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

时间:2018-02-16 10:31:47

标签: hibernate rest spring-boot spring-rest http-method

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

我看到了一些曲目:

  • here但我不知道它的魔力是什么MapperService
  • here但非常难看,我确信存在更好的解决方案
  • here但我不知道使用heavyResourceRepository方法的save(Map<String, Object> updates, String id)存储库类型是什么
  • 或可以/我们必须使用ModelMapper来映射非空字段吗?
  • here覆盖copyProperty方法

谢谢,PATCH方法可用,但我没有看到实现它的明确方法。

1 个答案:

答案 0 :(得分:1)

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

像这样导出端点时:

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

}

您将公开默认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;
}

要创建您的注册人,

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

要替换所有记录,请使用:

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

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

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

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

仅“姓氏”和“出生日期”将被更新。

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

您可以在此documentation中看到更多有关此内容的信息。搜索单词“ Patch”,您可以找到一些示例。

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

@Component
@RepositoryEventHandler
public class SomeEntityHandler {

    @Autowired
    private SomeEntityService someEntityService;

    @HandleBeforeCreate
    @HandleBeforeSave
    public void save(SomeEntity someEntity) {
        someEntity.verifyStringSize(someEntity.name);
    }
}

然后您可以引发异常,或将所有字符串更改为大写字符串,或任何其他所需的内容。