如何将正常的CrudRepository <T,ID>转换为ReactiveCrudRepository <T,ID>

时间:2019-11-11 08:32:45

标签: spring spring-boot spring-data-jpa spring-webflux project-reactor

我正在使用spring-data-jpaspring webflux。当我使用ReactiveCrudRepository扩展UserRepository时。我遇到错误:

org.springframework.dao.InvalidDataAccessApiUsageException: Reactive Repositories are not supported by DynamoDB. Offending repository is com.poc.crud.repository.EmployeeRepository!

如果我使用CrudRepository扩展并使用Mono.just(data-from-db)Flux.just(data-from-db)发送响应,那么一切都很好。

我的问题是,如何创建自定义的泛型ReactiveCrudRepository<T,ID>,以便所有crud方法都将返回Mono和Flux对象。

1 个答案:

答案 0 :(得分:1)

  

如果我使用CrudRepository扩展并使用Mono.just(data-from-db)和Flux.just(data-from-db)发送响应,那么一切都很好。

哇,那里-不,不是。您可能会认为一切都很好,但这是将阻止网络调用引入到响应式链中,一旦您并行运行几个调用,这将使速度变慢。更糟糕的是,您已经创建了一种“看起来”是反应性的方法,但不是-通常称为“冒名顶替的反应性方法”。

简单地说,将阻塞代码并使之具有响应性不可能-将其包装在Mono.just()中是行不通的。该库必须从头开始异步构建。

坏消息是,据我所知,DynamoDB目前(2019年11月)尚无ReactiveCrudRepository存储库支持,因此,如果您必须使用它,则会有点麻烦。 / p>

好消息是,亚马逊现在提供了asynchronous client for DynamoDB,您可以通过调用{{1}轻松地将CompleteableFuture包裹在Mono中}-因此您可以使用它来保持被动状态,并仍然具有DynamoDB支持。