2015-11-01 60 views
2

有一个注册了RestResource(Spring 3.1,Jackson 2.3)的类。 当我们试图保存对象的那样使用Spring Rest Resource更新空值更多信息

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

它成功保存。

我们有以下代码:

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

EntityService.patch(A)执行后,是DB(的Oracle 11g)没有变化,但我们希望,在DB PROP2将等于空了。

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

回答

4

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

在Spring框架中,在PATCH请求的上下文中,属性值为null意味着不应该对属性进行更改。我猜春季数据休息会将此逻辑转发到服务层,因此为了实际更新您的资源并使用null值,您应该发出对应于PUT语义的呼叫

+0

正是我发现的,谢谢。更多信息 - https://spring.io/understanding/REST – egorlitvinenko

0

因此,上面的答案是正确的。

不幸的是,PUT方法更新所有字段,并在某些情况下它可能是一个不好的解决方案。例如,如果我们在JSON对象中有许多空值,但没有修改。

要使Spring PATCH更新空值,只有当它发生更改时,我发现的最佳方式是扩展DomainObjectMerger类。 它是) REST MVC配置的一个bean,在其中我们可以覆盖方法Merge(entity.doWithProperties(新SimplePropertyHandler({})。在这种方法中,我们可以添加附加条件像

sourceValue != targetValue; 

独立于空sourceValue变量的值。