spring-data-rest - 如何在 Spring Data Rest 中使用具有覆盖端点方法的事件?
问题描述
我正在使用 spring-data-rest 并且我正在覆盖补丁端点。现在我遇到了问题,@RepositoryEventHandler @HandleAfterSave 没有触发任何事件。此外,我自己实现了一个 AbstractRepositoryEventListener 并覆盖了“onAfterSave”方法,什么也没有发生。
如果我删除我的覆盖并使用存储库中的默认补丁端点,它就可以工作。知道吗,如何使用覆盖的补丁端点获取事件?
解决方案
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
那里发布。的类publisher
是ApplicationEventPublisher
。
因此,解决方案应该是在您覆盖的补丁端点类和方法中implements ApplicationEventPublisherAware
发布事件。ApplicationEventPublisher
推荐阅读
- python - 扭曲并写入 stderr 异常
- c - 如何使用 C 合并和重新排列 CSV 文件中的数据?
- arduino - 如何使用 ESP8266 或类似设备读取 RJ45 MPPT 太阳能充电控制器
- python-3.x - Django Models 获取所有带有 ForeignKey 对象的模型
- c++ - 带有花括号的 for 循环中迭代器的 openMP 初始化
- python - 是否可以对另一个程序隐藏控制台窗口?
- javascript - Python Flask & HTML - 使用 html 滑块控制电机
- reactjs - 使用带有钩子的数组映射
- java - Lombok @Slf4j 和接口?
- api - 用户验证后分发 API 密钥