gpt4 book ai didi

java - Jackson Unmarshalling 未提供的值

转载 作者:行者123 更新时间:2023-12-01 10:50:20 28 4
gpt4 key购买 nike

我目前正在尝试实现一个 PATCH 端点,该端点应该只更改 JSON 帖子正文中实际提供的值。不幸的是, jackson 似乎将未提供的值视为 NULL,从而重置了这些现有值。以下示例:

public class Item {

@Id @GeneratedValue
private Long id;

private String name;

//getters+setters
}

以及相应的 Controller :

@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 才能实现这一目标?

最佳答案

也许问题中有一些我不明白的地方,但是:如果您在 JSON 中提供不完整的对象表示形式,则 java 中的结果字段将为 null。与此有何不同?当您保存(不完整的)反序列化对象时,JSON 中未指定的字段将被无效。你对此无能为力。您可以做的是检查要保存的 java 对象上的每个字段,并将旧值放入每个 null 字段中。

顺便说一句,这就是 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"
}
]

希望这能有所帮助。

关于java - Jackson Unmarshalling 未提供的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33959180/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com