Spring MVC PATCH方法:部分更新


问题内容

我有一个项目,我在其中使用Spring MVC + Jackson构建REST服务。假设我有以下java实体

public class MyEntity {
    private Integer id;
    private boolean aBoolean;
    private String aVeryBigString;
    //getter & setters
}

有时,我只想更新布尔值,而我并不认为仅用一个简单的布尔值发送带有大字符串的整个对象是一个好主意。因此,我考虑过使用PATCH
HTTP方法仅发送需要更新的字段。因此,我在控制器中声明以下方法:

@RequestMapping(method = RequestMethod.PATCH)
public void patch(@RequestBody MyVariable myVariable) {
    //calling a service to update the entity
}

问题是:我怎么知道哪些字段需要更新?例如,如果客户端只想更新布尔值,我将获得一个带有空“
aVeryBigString”的对象。我应该如何知道用户只想更新布尔值,而不想清空字符串?

我已经通过构建自定义URL来“解决”了这个问题。例如,以下URL:POST / myentities / 1 / aboolean /
true将被映射到仅更新布尔值的方法。该解决方案的问题在于它不符合REST。我不想100%兼容REST,但是我不愿意提供自定义URL来更新每个字段(特别是考虑到当我想更新多个字段时会引起问题)。

另一个解决方案是将“ MyEntity”拆分为多个资源并仅更新这些资源,但是我觉得这没有意义:“ MyEntity” 一个普通资源,它不是
其他资源 组成

那么,有没有解决此问题的优雅方法?


问题答案:

您可以将boolean更改为Boolean,并为所有不想更新的字段分配空值。唯一的一个非null值将定义您要更新的字段客户端。