Я использую JsonPatch (JSR-374) с реализацией из Apache org. apache .johnzon: johnzon-core: 1.2.4 в моей конечной точке PATCH проекта Spring:
@Bean
@Primary
public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {
ObjectMapper objectMapper = builder.createXmlMapper(false).build();
objectMapper.registerModule(new Jdk8Module());
objectMapper.registerModule(new JSR353Module());
return objectMapper;
}
Контроллер
@PatchMapping("/settings")
public ResponseEntity<SettingsResponse> patchSettings(@RequestBody JsonPatch patchDocument, Locale locale) {...}
С json запросом простого атома c значения
[
{ "op": "replace", "path": "/currency", "value": "EUR" },
{ "op": "test", "path": "/version", "value": 10 }
]
Экземпляр JsonPatch правильно десериализован Джексоном
Но с комплексным типом значения (объект):
[
{ "op": "replace", "path": "/currency", "value": {"code": "USD", "label": "US Dollar"} },
{ "op": "test", "path": "/version", "value": 10 }
]
Возникло исключение
Причина: com.faster xml .jackson.databind.ex c .InvalidDefinitionException: Невозможно создать экземпляр javax.json.JsonPatch
(создатели, такие как конструкция по умолчанию, не существуют): абстрактные типы либо должны быть сопоставлены с конкретными типами, либо иметь собственный десериализатор, либо содержать дополнительную информацию о типе в [Source: (PushbackInputStream); строка: 1, столбец: 1]
Я считаю, что JsonPatch (и его Apache JsonPatchImpl) способен работать со сложными типами, поскольку JsonValue упоминает JsonObject и ValueType.OBJECT, но я не знаю как поручить Джексону правильно десериализовать
Заранее благодарим за любые предложения или помощь!