我目前正在嘗試實現一個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);)
,所以不提供名稱。
我該如何配置傑克遜來實現這個目標?
您是否在控制器中檢查名稱是否存在於Item方法參數中? – Mohit
你的意思是手動進行檢查?例如,首先從數據庫加載現有實體,然後檢查提供的實體是否具有設置的值,如果它存在且不同,則更新值? 然後我會如何NULL值(例如,如果我想取消連接的連接)? 並不會像對整個對象做PUT一樣嗎? – Alex
我的意思是縮小JSON轉換和數據存儲庫之間的問題?哪個組件正在吃掉「name」參數的值? – Mohit