在自定义Spring MVC控制器中支持HTTP PATCH的最佳实践是什么?特别是在使用HATEOAS / HAL时?有没有一种更简单的方法来合并对象,而不必检查请求json中每个字段的存在(或编写和维护DTO),最好是自动解组资源链接?
我知道Spring Data Rest中存在此功能,但是可以在定制控制器中使用它吗?
我认为您无法在此处使用spring-data-rest功能。
spring-data-rest在内部使用json-patch库。基本上我认为工作流程如下:
我认为最困难的部分是第四点。但是,如果您不必具有通用解决方案,则可能会更容易。
如果您想了解spring-data-rest的功能,请查看 org.springframework.data.rest.webmvc.config.JsonPatchHandler
org.springframework.data.rest.webmvc.config.JsonPatchHandler
编辑
在最新数据中,spring-data-rest中的补丁机制发生了显着变化。最重要的是,它不再使用json-patch库,现在从头开始实现json补丁支持。
我可以设法在自定义控制器方法中重用主要补丁功能。
以下代码段说明了基于spring-data-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); } }