2015-11-27 91 views
0

我目前正在嘗試實現一個PATCH端點,該端點只應更改實際在JSON Post Body中提供的值。不幸的是,它看起來像傑克遜將非提供的值視爲NULL,因此重置了這些現有值。 下面的例子:傑克遜解組未提供的值

public class Item { 

    @Id @GeneratedValue 
    private Long id; 

    private String name; 

    //getters+setters 
} 

和根據控制器:

@RequestMapping(value = /item/{id}, method = RequestMethod.PATCH) 
public ResponseEntity<Item> patchItem(@PathVariable("id") Long itemId, @RequestBody Item item) { 
    if (itemRepository.exists(itemId) && item.getId().equals(itemId)) { 
     Item newItem = itemRepository.save(item); 
     return new ResponseEntity<>(newItem, HttpStatus.OK); 
    } 
    throw new ResourceNotFoundException("could not find Item with id " + itemId); 
} 

現在當我打電話給該端點只提供,我想現有的名稱不被清零的ID:

PATCH to /item/1 with postbody { "id":1 } 

應導致

{ 
    "id":1, 
    "name":"value_before_patch" 
} 

而不是{ "id":1 }(因爲現在是builder.serializationInclusion(JsonInclude.Include.NON_NULL);),所以不提供名稱。

我該如何配置傑克遜來實現這個目標?

+0

您是否在控制器中檢查名稱是否存在於Item方法參數中? – Mohit

+0

你的意思是手動進行檢查?例如,首先從數據庫加載現有實體,然後檢查提供的實體是否具有設置的值,如果它存在且不同,則更新值? 然後我會如何NULL值(例如,如果我想取消連接的連接)? 並不會像對整個對象做PUT一樣嗎? – Alex

+0

我的意思是縮小JSON轉換和數據存儲庫之間的問題?哪個組件正在吃掉「name」參數的值? – Mohit

回答

1

也許有些問題我不明白,但是: 如果您在JSON中提供不完整的對象表示形式,那麼java中的結果字段將爲空。這與它有什麼不同?保存(不完整)反序列化對象時,未在JSON中指定的字段將被取消。你無法做任何事情。 你可以做的是檢查你要保存的java對象的每個字段,並將舊值放入每個空字段。

作爲一個方面說明,這就是原因(afaict)PATCH不是一種常見的服務,即特別是如果你有複雜的對象時很難實現。

編輯: 我不知道json-patch建議的標準。這可能是您嘗試實現的解決方案。我建議你看看this tutorial on how to integrate it with Jersey,甚至在rfc (6902)。簡而言之,json-patch會正式確定如何發送命令(補丁)以選擇性地修改對象。一個例子是:

給出一個對象的JSON初始表示是

{ 
    "list" : [ 
    "one", 
    "two" 
    ], 
    "message" : "message", 
    "title" : "title" 
} 

您可以用JSON修補它像

[ 
    { 
    "op" : "replace", 
    "path" : "/message", 
    "value" : "otherMessage" 
    }, 
    { 
    "op" : "add", 
    "path" : "/list/-", 
    "value" : "three" 
    } 
] 

希望這可以幫助。

+0

然後,我會如何解除我想明確指定的值? (對於整個對象來說,這樣做會不會更像是一樣嗎?) – Alex

+0

理論上你不能,也就是說,你無法區分你接收到的null是否是一個未更新的字段或無效的。這是更新操作通常用PUT而不是PATCH實現的另一個原因。如果您想使用PATCH,想到的解決方法是定義一個用於聲明空對象的約定(例如,空字符串將爲'「null」')。這樣你可以區分這兩種情況,但它有很多缺點。 –

+0

@francesco foresti即:布爾人 – Whimusical