首页 > 解决方案 > 如何在 Spring Data Rest 中使用具有覆盖端点方法的事件?

问题描述

我正在使用 spring-data-rest 并且我正在覆盖补丁端点。现在我遇到了问题,@RepositoryEventHandler @HandleAfterSave 没有触发任何事件。此外,我自己实现了一个 AbstractRepositoryEventListener 并覆盖了“onAfterSave”方法,什么也没有发生。

如果我删除我的覆盖并使用存储库中的默认补丁端点,它就可以工作。知道吗,如何使用覆盖的补丁端点获取事件?

标签: spring-data-rest

解决方案


RepositoryEntityController有一个方法patchItemResource

@RequestMapping(value = BASE_MAPPING + "/{id}", method = RequestMethod.PATCH)
public ResponseEntity<RepresentationModel<?>> patchItemResource(RootResourceInformation resourceInformation,
    PersistentEntityResource payload, @BackendId Serializable id, PersistentEntityResourceAssembler assembler,
    ETag eTag, @RequestHeader(value = ACCEPT_HEADER, required = false) String acceptHeader)
    throws HttpRequestMethodNotSupportedException, ResourceNotFoundException {

  resourceInformation.verifySupportedMethod(HttpMethod.PATCH, ResourceType.ITEM);

  Object domainObject = payload.getContent();

  eTag.verify(resourceInformation.getPersistentEntity(), domainObject);

  return saveAndReturn(domainObject, resourceInformation.getInvoker(), PATCH, assembler,
      config.returnBodyOnUpdate(acceptHeader));
}

上面的 return 语句调用saveAndReturn.

private ResponseEntity<RepresentationModel<?>> saveAndReturn(Object domainObject, RepositoryInvoker invoker,
    HttpMethod httpMethod, PersistentEntityResourceAssembler assembler, boolean returnBody) {

  publisher.publishEvent(new BeforeSaveEvent(domainObject));
  Object obj = invoker.invokeSave(domainObject);
  publisher.publishEvent(new AfterSaveEvent(obj));

  PersistentEntityResource resource = assembler.toFullResource(obj);
  HttpHeaders headers = headersPreparer.prepareHeaders(Optional.of(resource));

  if (PUT.equals(httpMethod)) {
    addLocationHeader(headers, assembler, obj);
  }

  if (returnBody) {
    return ControllerUtils.toResponseEntity(HttpStatus.OK, headers, resource);
  } else {
    return ControllerUtils.toEmptyResponse(HttpStatus.NO_CONTENT, headers);
  }
}

BeforeSaveEvent和在AfterSaveEvent那里发布。的类publisherApplicationEventPublisher

因此,解决方案应该是在您覆盖的补丁端点类和方法中implements ApplicationEventPublisherAware发布事件。ApplicationEventPublisher


推荐阅读