gpt4 book ai didi

带有补丁方法的 Spring Data Rest 自定义 Controller - 如何将资源与实体合并

转载 作者:行者123 更新时间:2023-12-04 15:40:11 24 4
gpt4 key购买 nike

默认情况下,当我们有一个暴露了 save 方法的存储库时,我们可以执行 PATCH 请求。然后 Spring Data REST 从数据库中检索原始对象并将更改应用于实体,然后为我们保存它(在 JsonPatchHandler 类中)。这允许我们对类做以下请求

class Address {
Long id;
String street;
Long houseNumber;
}

PATCH/api/addresses/1 与正文
{ houseNumber: 123 }

并且只有这一个字段会被更改。

现在有了自定义 Controller ,我们希望在更新方法中接收整个对象(在 HATEOAS 将其与数据库中的原始对象合并后)
@RepositoryRestController
@ExposesResourceFor(Address.class)
@ResponseBody
@RequestMapping("/addresses")
public class AdddressController {

@PatchMapping("/{addressId}")
public Resource<Address> update(@RequestBody Resource<Address> addressResource, @PathVariable Long addressId) {
Address address= addressResource.getContent();
// .... some logic
address = addressRepository.save(address);
return new Resource<>(address);
}
}

不幸的是,在我会做一些逻辑的地方,我得到了带有空字段而不是合并对象的地址。

是否可以将自定义 Controller 插入 Spring Data REST 堆栈中,以便在修补请求时为我合并它(就像对普通存储库一样)?

编辑 :
我想找到一个与 PATCH(content-type:application/json-patch+json) 和 PATCH(content-type: application/hal+json) 透明工作的解决方案

最佳答案

浏览 Spring 源代码后,我没有找到合理的解决方案。结果,我在他们的 - JIRA 中创建了问题。

目前唯一合理的解决方法是 - 创建自定义 Controller ,将 PersitentEntityResource 作为参数并在其路径中同时包含 {id} 和 {repository} 占位符,即

@PatchMapping("/addresses/{id}/{repository}")
public Resource<Address> update(PersistentEntityResource addressResource) {
...
}

这使得调用端点/addresses/123/addresses

关于带有补丁方法的 Spring Data Rest 自定义 Controller - 如何将资源与实体合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44285841/

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