Paw*_*weł 6 spring spring-mvc hateoas spring-data-rest spring-hateoas
默认情况下,当我们有一个暴露了save方法的存储库时,我们可以执行PATCH请求.然后,Spring Data REST从数据库中检索原始对象并将更改应用于实体,然后将其保存给我们(在JsonPatchHandler类中).这允许我们为类做以下请求
class Address {
Long id;
String street;
Long houseNumber;
}
Run Code Online (Sandbox Code Playgroud)
PATCH/api /地址/ 1与身体
{ houseNumber: 123 }
Run Code Online (Sandbox Code Playgroud)
只有这一个领域才会改变.
现在有了自定义控制器,我们希望在update方法中接收整个对象(在HATEOAS将其与来自DB的原始对象合并之后)
@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);
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,在我会做一些逻辑的地方,我得到的地址是空字段而不是合并对象.
是否可以在Spring Data REST堆栈中插入自定义控制器,以便在修补请求时将它合并为我(就像它对普通存储库一样)?
编辑:我想找到一个透明地与PATCH(内容类型:application/json-patch + json)和PATCH(内容类型:application/hal + json)一起工作的解决方案
浏览了 Spring 源码后,我还没有找到合理的解决方案。结果我在他们的 - JIRA中创建了问题
目前唯一合理的解决方法是 - 创建以PersitentEntityResource作为参数并在其路径中同时具有{id}和{repository}占位符的自定义控制器,即
@PatchMapping("/addresses/{id}/{repository}")
public Resource<Address> update(PersistentEntityResource addressResource) {
...
}
Run Code Online (Sandbox Code Playgroud)
这使得调用端点/addresses/123/addresses
| 归档时间: |
|
| 查看次数: |
1277 次 |
| 最近记录: |