处理自定义POST PUT中的关联条目和spring数据其余部分中的PATCH请求

问题描述 投票:0回答:1

我有一个要求,我必须在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的实现变得容易得多。

有没有办法解决这个问题?

我有一个要求,我必须在POST,PATCH和PUT端点中具有自定义业务逻辑。使用SDR事件是不可能的,因为我需要做一些事务处理...

java spring spring-boot spring-data-rest
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.