为了账号安全,请及时绑定邮箱和手机立即绑定

在 Spring Data Rest 中处理自定义 POST PUT 和 PATCH

在 Spring Data Rest 中处理自定义 POST PUT 和 PATCH

墨色风雨 2024-01-05 16:45:01
我有一个要求,其中我必须在 POST、PATCH 和 PUT 端点中具有自定义业务逻辑。不可能使用 SDR 事件,因为我需要在请求中执行一些事务操作。因此,我决定为通过服务类附加到存储库的实体创建自定义端点。@RepositoryRestController@RequestMapping("/myEntity")@ExposesResourceFor(MyEntity.class)public class MyEntityResource {    @PostMapping(value = "", produces = MediaTypes.HAL_JSON_VALUE)    public ResponseEntity postResult(@RequestBody Entity entity) {        // my logic    }}现在我面临一个问题,我的 POST 请求可以具有到其他实体的关联链接。SDR 的默认实现可以很好地处理这个问题,但我遇到了 Jackson 映射错误。JSON parse error: Cannot construct instance of `com.foo.bar.Entity` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('/api/v1/entity/12345678-1234-1234-1234-123456789012')于是我查了一下Spring的实现方式,发现了以下方法@ResponseBody@RequestMapping(value = BASE_MAPPING, method = RequestMethod.POST)public ResponseEntity<ResourceSupport> postCollectionResource(RootResourceInformation resourceInformation,        PersistentEntityResource payload, PersistentEntityResourceAssembler assembler,        @RequestHeader(value = ACCEPT_HEADER, required = false) String acceptHeader)我发现,PersistentEntityResource payload填充了获取的关联实体,并且主要实体通过对存储库的正常保存调用进行保存。因此,我尝试了自动装配,PersistentEntityResource但本质上失败了,因为调用者PersistentEntityResource期望映射 url 的形式/{repository}/<optional id>,并且我已经知道我的路径是什么,PersistentEntityResource因此无法初始化。它也没有帮助,它PersistentEntityResource不是通用的(它达到了 SDR 2.0.0.M1,之后被删除)。能够使用也PersistentEntityResource会使 PATCH 和 PUT 的实现变得更加容易。有什么办法可以处理这个问题吗?
查看完整描述

1 回答

?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

经过一番挖掘后我找到了答案。事后看来,这是非常微不足道的。只需在方法参数中使用Resource<Entity>代替即可。Entity


@RepositoryRestController

@RequestMapping("/myEntity")

@ExposesResourceFor(MyEntity.class)

public class MyEntityResource {

    @PostMapping(value = "", produces = MediaTypes.HAL_JSON_VALUE)

    public ResponseEntity postResult(@RequestBody Resource<Entity> entity) {

        // my logic. Fetch the entity with entity.getContent()

    }

}

您可以使用获取实体本身entity.getContent()


查看完整回答
反对 回复 2024-01-05
  • 1 回答
  • 0 关注
  • 119 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信