В настоящее время я пытаюсь реализовать конечную точку PATCH, которая должна только изменять значения, которые фактически предоставляются в Почте отправления JSON. К сожалению, похоже, что Джексон обрабатывает не предоставленные значения как NULL, но, таким образом, сбросив эти существующие значения. Следуя примеру:Jackson Unmarshalling not-provided values
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);
}
Когда я взываю к этой конечной точке в настоящее время только с идентификатором при условии, я хочу имя существующего НЕ обнулится:
PATCH to /item/1 with postbody { "id":1 }
должно содержать
{
"id":1,
"name":"value_before_patch"
}
и не в { "id":1 }
(имя не указано из-за builder.serializationInclusion(JsonInclude.Include.NON_NULL);)
как сейчас.
Как мне настроить Jackson для достижения этого?
Вы проверили, присутствует ли имя в параметре Item method в вашем контроллере? – Mohit
Вы имеете в виду делать проверки вручную? Например, сначала загрузив существующий объект из базы данных, а затем проверьте, имеет ли поставленный объект значение, установленное и если оно есть и другое, а затем обновить значения? Как бы мне было тогда NULL значение (например, если я хочу отключить соединение)? И не будет ли это более или менее таким же, как выполнение PUT со всем объектом? – Alex
Что я имею в виду, чтобы сузить проблему между конверсией JSON и хранилищем данных? Какой компонент потребляет значение параметра «имя»? – Mohit