繁体   English   中英

在 spring 数据 rest 中处理自定义 POST PUT 和 PATCH 请求中的关联条目

[英]Handling association entries in custom POST PUT and PATCH requests in spring data rest

我有一个要求,其中我必须在 POST、PATCH 和 PUT 端点中有自定义业务逻辑。 使用 SDR 事件是不可能的,因为我需要在请求中执行几个事务操作。 因此,我决定为通过服务 class 附加到存储库的实体创建自定义端点。

@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 的实现变得更加容易。

有什么办法可以处理这个吗?

经过一番挖掘,我找到了答案。 事后看来,这是非常微不足道的。 只需在方法参数中使用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()获取实体本身

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM