4

Какова наилучшая практика для поддержки HTTP PATCH в пользовательских контроллерах Spring MVC? В частности, при использовании HATEOAS/HAL? Есть ли более простой способ объединить объекты без необходимости проверять наличие каждого отдельного поля в запросе json (или писать и поддерживать DTO), в идеале с автоматическим развязыванием ссылок на ресурсы?Пользовательские запросы MVC HTTP Spring Spring с функцией Spring Data Rest

Я знаю, что эта функция существует в Spring Data Rest, но можно ли использовать ее для использования в пользовательских контроллерах?

ответ

8

Я не думаю, что здесь вы можете использовать функциональность «весна-данные-отдых».

весна-данные-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); 
      } 
     } 
+0

Спасибо! Да, я прорыл источники SDR. Похоже, что большая часть этой функции может быть распущена из самого SDR для более общего решения. Это, безусловно, упростит ручной настройку пользовательских контроллеров HATEOAS. –

+0

Когда я пытаюсь это сделать, я получаю 'java.io.IOException: Stream closed' в' objectMapper.readTree (inputStream) '. Любая идея почему? – aycanadal

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