gpt4 book ai didi

spring - 具有 Spring Data Rest 功能的自定义 Spring MVC HTTP 补丁请求

转载 作者:行者123 更新时间:2023-12-04 17:33:36 24 4
gpt4 key购买 nike

在自定义 Spring MVC Controller 中支持 HTTP PATCH 的最佳实践是什么?特别是在使用 HATEOAS/HAL 时?有没有更简单的方法来合并对象,而不必检查请求 json 中每个字段的存在(或编写和维护 DTO),理想情况下是自动解码资源链接?

我知道 Spring Data Rest 中存在此功能,但是否可以利用它在自定义 Controller 中使用?

最佳答案

我认为您不能在这里使用 spring-data-rest 功能。

spring-data-rest 正在使用 json-patch图书馆内部。基本上我认为工作流程如下:

  • 读取您的实体
  • 使用 objectMapper 将其转换为 json
  • 应用补丁(这里你需要 json-patch)(我认为你的 Controller 应该将 JsonPatchOperation 列表作为输入)
  • 将修补后的 json 合并到您的实体中

  • 我认为困难的部分是第四点。但是,如果您不必拥有通用解决方案,则可能会更容易。

    如果您想了解 spring-data-rest 的作用 - 查看 org.springframework.data.rest.webmvc.config.JsonPatchHandler
    编辑

    spring-data-rest 中的补丁机制在最新版本中发生了显着变化。最重要的是,它不再使用 json-patch 库,现在从头开始实现 json 补丁支持。

    我可以设法在自定义 Controller 方法中重用主要补丁功能。

    以下代码段说明了基于 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);
    }
    }

    关于spring - 具有 Spring Data Rest 功能的自定义 Spring MVC HTTP 补丁请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33288670/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com