Я не думаю, что здесь вы можете использовать функциональность «весна-данные-отдых».
весна-данные-rest используется json-patch библиотека внутри. В принципе, я думаю, что рабочий процесс будет выглядеть следующим образом:
- читать вашу сущность
- преобразовать его в формат JSON с помощью ObjectMapper
- применить патч (здесь вам нужно JSON-патч) (я думаю, что ваш контроллер должен принять список JsonPatchOperation в качестве входных данных)
- объединить исправленная в JSON вашей организации
Я думаю, что твердая часть четвертая точка. Но если вам не нужно иметь общее решение, это может быть проще.
Если вы хотите, чтобы получить представление о том, что весна-данных остальное делает - смотреть на org.springframework.data.rest.webmvc.config.JsonPatchHandler
EDIT
Механизм патч весной-данных-отдыха значительно изменилось в последние релизы. Самое главное, что он больше не использует библиотеку json-patch и теперь использует json-патч с нуля.
Я мог бы повторно использовать функциональность основного патча в специальном методе контроллера.
Следующий фрагмент кода иллюстрирует подход, основанный на весенне-данных-Rest 2,6
import org.springframework.data.rest.webmvc.IncomingRequest;
import org.springframework.data.rest.webmvc.json.patch.JsonPatchPatchConverter;
import org.springframework.data.rest.webmvc.json.patch.Patch;
//...
private final ObjectMapper objectMapper;
//...
@PatchMapping(consumes = "application/json-patch+json")
public ResponseEntity<Void> patch(ServletServerHttpRequest request) {
MyEntity entityToPatch = someRepository.findOne(id)//retrieve current state of your entity/object to patch
Patch patch = convertRequestToPatch(request);
patch.apply(entityToPatch, MyEntity.class);
someRepository.save(entityToPatch);
//...
}
private Patch convertRequestToPatch(ServletServerHttpRequest request) {
try {
InputStream inputStream = new IncomingRequest(request).getBody();
return new JsonPatchPatchConverter(objectMapper).convert(objectMapper.readTree(inputStream));
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
Спасибо! Да, я прорыл источники SDR. Похоже, что большая часть этой функции может быть распущена из самого SDR для более общего решения. Это, безусловно, упростит ручной настройку пользовательских контроллеров HATEOAS. –
Когда я пытаюсь это сделать, я получаю 'java.io.IOException: Stream closed' в' objectMapper.readTree (inputStream) '. Любая идея почему? – aycanadal