使用 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 变量的空值。
有一个用 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 变量的空值。