Spring Data Rest自定义控制器与补丁方法 - 如何将资源与实体合并

时间:2017-05-31 13:13:40

标签: spring spring-mvc spring-data-rest hateoas spring-hateoas

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

执行以下请求
class Address {
     Long id;
     String street;
     Long houseNumber;
}

PATCH / api / addresses / 1 with body

{ houseNumber: 123 }

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

现在有了自定义控制器,我们希望在update方法中接收整个对象(在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);
    }
}

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

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

修改: 我想找到一个透明地与PATCH(内容类型:应用程序/ json-patch + json )和PATCH(内容类型: application / hal + json

1 个答案:

答案 0 :(得分:2)

浏览Spring源代码后,我找不到合理的解决方案。结果我在他们的JIRA

中创建了问题

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

t2

使调用端点 / addresses / 123 / addresses