PersistentEntityResource

PersistentEntityResource

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

有什么办法可以解决这个问题?

最佳答案

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

08-07 15:00