有一个用RestResource注释的类(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。
这是一种正常的行为(我想也许是的,因为空值可能理解为没有改变)? 有没有一种简单的方法来改变这种行为?
答案 0 :(得分:4)
在谈到HTTP谓词时,PATCH
请求描述了应该对现有对象进行的差异。它使您可以轻松创建部分更新,而无需通过REST公开特定的资源属性。
在Spring框架中,在PATCH
请求的上下文中,属性的null
值意味着不应对属性进行任何更改。我想Spring数据会将此逻辑转发给服务层,因此为了使用null
值实际更新资源,您应该发出与PUT
语义相对应的调用
答案 1 :(得分:0)
所以,上面的答案是正确的。
不幸的是,PUT方法会更新所有字段,在某些情况下,它可能是一个糟糕的解决方案。例如,如果我们在JSON-object中有许多空值,那么它们没有被修改。
要使Spring PATCH更新null值,只有当它发生变化时,我发现的最佳方法是扩展DomainObjectMerger类。 它是REST MVC配置的bean,我们可以在其中覆盖方法merge(entity.doWithProperties(new SimplePropertyHandler(){})。 在这种方法中,我们可以添加添加条件,如
sourceValue != targetValue;
独立于sourceValue变量的空值。