【发布时间】:2016-03-01 18:17:06
【问题描述】:
我目前正在尝试实现一个 PATCH 端点,该端点应该只更改 JSON 帖子正文中实际提供的值。不幸的是,杰克逊似乎将未提供的值视为 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);) 现在没有提供名称。
我需要如何配置 Jackson 来实现这一点?
【问题讨论】:
-
您是否检查了控制器中的 Item 方法参数中是否存在该名称?
-
您的意思是手动进行检查?例如,首先从数据库中加载现有实体,然后检查提供的实体是否设置了值,如果存在并且不同,然后更新值?然后我将如何 NULL 一个值(例如,如果我想取消链接)?这与对整个对象执行 PUT 是否或多或少相同?
-
我的意思是缩小JSON转换和数据存储库之间的问题?哪个组件占用了“name”参数的值?
-
该名称不是方法参数的一部分 - 在我的示例中它只是 id。这就是 PATCH 方法的全部思想:您只提供您实际想要更改的字段(在这种情况下,我的示例有点草率,因为我不希望更改 id,但为了简单起见......) .
标签: java json rest spring-boot jackson