如何使数据 REST 存储库方法异步
How to make Data REST repository method Asynchronous
是否可以通过 @RepositoryRestResource
annoation Async 将存储库公开为 rest 资源?或者换句话说,我希望保存、查找等方法是异步的,并且 ResponseEntityController
也将这些处理为异步调用?
如果我只是将存储库标记为同步,我的 POST 请求将失败,因为 ResponseEntityController
上的此方法不会处理对存储库的异步持续调用
private ResponseEntity<ResourceSupport> createAndReturn(Object domainObject, RepositoryInvoker invoker,
PersistentEntityResourceAssembler assembler, boolean returnBody) {
publisher.publishEvent(new BeforeCreateEvent(domainObject));
Object savedObject = invoker.invokeSave(domainObject);
publisher.publishEvent(new AfterCreateEvent(savedObject));
Optional<PersistentEntityResource> resource = Optional
.ofNullable(returnBody ? assembler.toFullResource(savedObject) : null);
HttpHeaders headers = headersPreparer.prepareHeaders(resource);
addLocationHeader(headers, assembler, savedObject);
return ControllerUtils.toResponseEntity(HttpStatus.CREATED, headers, resource);
}
这是我的存储库
@RepositoryRestResource(path = "companies", collectionResourceRel = "companies")
public interface CompanyRepository extends CrudRepository<Company, Long> {
@Override
@RestResource(exported = false)
void delete(Company entity);
@Override
@RestResource(exported = false)
void deleteById(Long id);
@Override
@RestResource(exported = false)
void deleteAll();
@Override
@RestResource(exported = false)
void deleteAll(Iterable<? extends Company> entities);
}
我发现的唯一方法是坚持使用 Spring Data JPA 并编写您自己的 HATEOAS 控制器返回 CompletableFutures,它从 JPA 返回的值调用 assemble HATEAOS 资源的服务存储库。然后可以使用线程池执行器或并发执行器等异步调用服务和服务到 JPA 存储库的控制器。
是否可以通过 @RepositoryRestResource
annoation Async 将存储库公开为 rest 资源?或者换句话说,我希望保存、查找等方法是异步的,并且 ResponseEntityController
也将这些处理为异步调用?
如果我只是将存储库标记为同步,我的 POST 请求将失败,因为 ResponseEntityController
上的此方法不会处理对存储库的异步持续调用
private ResponseEntity<ResourceSupport> createAndReturn(Object domainObject, RepositoryInvoker invoker,
PersistentEntityResourceAssembler assembler, boolean returnBody) {
publisher.publishEvent(new BeforeCreateEvent(domainObject));
Object savedObject = invoker.invokeSave(domainObject);
publisher.publishEvent(new AfterCreateEvent(savedObject));
Optional<PersistentEntityResource> resource = Optional
.ofNullable(returnBody ? assembler.toFullResource(savedObject) : null);
HttpHeaders headers = headersPreparer.prepareHeaders(resource);
addLocationHeader(headers, assembler, savedObject);
return ControllerUtils.toResponseEntity(HttpStatus.CREATED, headers, resource);
}
这是我的存储库
@RepositoryRestResource(path = "companies", collectionResourceRel = "companies")
public interface CompanyRepository extends CrudRepository<Company, Long> {
@Override
@RestResource(exported = false)
void delete(Company entity);
@Override
@RestResource(exported = false)
void deleteById(Long id);
@Override
@RestResource(exported = false)
void deleteAll();
@Override
@RestResource(exported = false)
void deleteAll(Iterable<? extends Company> entities);
}
我发现的唯一方法是坚持使用 Spring Data JPA 并编写您自己的 HATEOAS 控制器返回 CompletableFutures,它从 JPA 返回的值调用 assemble HATEAOS 资源的服务存储库。然后可以使用线程池执行器或并发执行器等异步调用服务和服务到 JPA 存储库的控制器。