2015-11-27 2 views
0

В настоящее время я пытаюсь реализовать конечную точку 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 для достижения этого?

+0

Вы проверили, присутствует ли имя в параметре Item method в вашем контроллере? – Mohit

+0

Вы имеете в виду делать проверки вручную? Например, сначала загрузив существующий объект из базы данных, а затем проверьте, имеет ли поставленный объект значение, установленное и если оно есть и другое, а затем обновить значения? Как бы мне было тогда NULL значение (например, если я хочу отключить соединение)? И не будет ли это более или менее таким же, как выполнение PUT со всем объектом? – Alex

+0

Что я имею в виду, чтобы сузить проблему между конверсией JSON и хранилищем данных? Какой компонент потребляет значение параметра «имя»? – Mohit

ответ

1

Возможно, есть что-то, что я не понимаю в вопросе, но: Если вы предоставите неполное представление объекта в JSON, результирующие поля в java будут иметь значение NULL. Как он может отличаться от этого? Когда вы сохраняете (неполный) десериализованный объект, поля, которые не были указаны в 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

Как бы я затем сбросить значение, которое я хочу явно указать? (И не будет ли это более или менее таким же, как выполнение PUT со всем объектом?) – Alex

+0

Теоретически вы не можете, то есть вы не можете отличить, является ли нуль, который вы получаете, не обновляемым полем или аннулированный. Это еще одна причина, по которой операция обновления обычно реализуется с помощью PUT, а не PATCH. Если вы хотите использовать PATCH, обходным путем, которое приходит на ум, является определение соглашения для объявления нулевых объектов (например, пустая строка должна быть «null»). Таким образом, вы можете отличить два случая, но в нем много недостатков. –

+0

@francesco foresti i.e: booleans – Whimusical

Смежные вопросы