使用Spring Rest Resource更新空值

时间:2015-11-01 13:14:36

标签: java spring spring-mvc spring-data-rest

有一个用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。

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

2 个答案:

答案 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变量的空值。