2015-11-01 57 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變量的值。