使用 Spring Rest Resource 更新空值

Null values update with Spring Rest Resource

有一个用 RestResource 注释的 class(Spring 3.1,Jackson 2.3)。 当我们尝试像那样保存对象 A 时

A: {"prop1":1, "prop2":2} 

保存成功

我们有以下代码:

A.setProp2(null);
EntityService.patch(A);
A: {"prop1":1, "prop2":null} 

EntityService.patch(A) 执行后,DB (Oracle 11g) 中没有任何变化,但我们希望 DB 中的 prop2 也等于 null。

这是正常行为吗(我想也许是的,因为空值可能理解为没有改变)? 有没有简单的方法可以改变这种行为?

在谈到 HTTP 动词时,PATCH 请求描述了应该对现有对象进行的区别。这样做是为了让您可以轻松创建部分更新,而无需通过 REST 公开特定资源 属性。

在 Spring 框架中,在 PATCH 请求的上下文中,属性 的 null 值意味着 属性 不应更改制成。我猜 spring 数据 rest 将此逻辑转发到服务层,因此为了实际使用 null 值更新您的资源,您应该发出与 PUT 语义相对应的调用

所以,上面的答案是正确的。

不幸的是,PUT 方法会更新所有字段,在某些情况下这可能是一个糟糕的解决方案。例如,如果我们在 JSON-object 中有很多 null,但没有被修改。

要使 Spring PATCH 更新空值,只有当它发生变化时,我发现最好的方法是扩展 DomainObjectMerger class。 它是 REST MVC 配置的 bean,我们可以在其中覆盖方法合并 (entity.doWithProperties(new SimplePropertyHandler() {})。 在这个方法中,我们可以添加附加条件,如

sourceValue != targetValue;

独立于 sourceValue 变量的空值。