将 Spring Data 的 ReactiveCrudRepository 应用到 Redis

Posted

技术标签:

【中文标题】将 Spring Data 的 ReactiveCrudRepository 应用到 Redis【英文标题】:Apply Spring Data's ReactiveCrudRepository to Redis 【发布时间】:2018-06-09 06:03:46 【问题描述】:

我正在使用 webflux 使用 Spring Boot 2。我正在尝试使用ReactiveSortingRepository 来简化redis 操作。

public interface DataProfileRepository extends ReactiveSortingRepository<DataProfileDTO, String> 

只需使用这个界面

Mono<DataProfileDTO> tmp = this.dataProfileRepository.findById(id);

例外:

org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [com.tradeshift.dgps.dto.DataProfileDTO] to type [reactor.core.publisher.Mono<?>]
at org.springframework.core.convert.support.GenericConversionService.handleConverterNotFound(GenericConversionService.java:321) ~[spring-core-5.0.2.RELEASE.jar:5.0.2.RELEASE]
at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:194) ~[spring-core-5.0.2.RELEASE.jar:5.0.2.RELEASE]
at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:174) ~[spring-core-5.0.2.RELEASE.jar:5.0.2.RELEASE]
at org.springframework.data.repository.util.ReactiveWrapperConverters.toWrapper(ReactiveWrapperConverters.java:197) ~[spring-data-commons-2.0.2.RELEASE.jar:2.0.2.RELEASE]
at org.springframework.data.repository.core.support.QueryExecutionResultHandler.postProcessInvocationResult(QueryExecutionResultHandler.java:104) ~[spring-data-commons-2.0.2.RELEASE.jar:2.0.2.RELEASE]
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:587) ~[spring-data-commons-2.0.2.RELEASE.jar:2.0.2.RELEASE]

被抛出。

这个存储库的行为与反应器不匹配,我可以在调试模式下看到,实际的 DataProfileDTO 是从 redis 获取的。尝试时失败:

GENERIC_CONVERSION_SERVICE.convert(reactiveObject, targetWrapperType);

ReactiveWrapperConverters.toWrapper

我去谷歌搜索,似乎 Spring Data Redis 2.0 没有提到响应式存储库支持。我想知道我在代码中做错了什么,或者 Spring Data Redis 2.0 还不支持 ReactiveCrudRepository。

【问题讨论】:

你弄明白了吗? Spring Data Redis 2.3.8.RELEASE 不支持反应式存储库。 bean 创建时的异常消息是“org.springframework.dao.InvalidDataAccessApiUsageException:Redis 不支持 Reactive Repositories。违规存储库是 xx.xxxx.xxxx.XRepository!” 【参考方案1】:

根据 Spring 的 Reactive Redis Support 文档,与 Redis 交互并支持响应式支持的最高抽象级别是 ReactiveRedisTemplateReactiveRedisConnection 是较低的抽象,它使用二进制值 (ByteBuffer) 作为输入和输出。

没有提到对响应式存储库的支持。 也可以参考spring-data github repo中官方的响应式示例。

为了使所有这些工作,您需要在您正在使用的驱动程序中提供响应式支持 - 目前是lettuce。

虽然不理想,但替代方案是Flux.fromIterable()。您可以使用阻塞存储库并以反应方式处理结果。

public interface DataProfileRepository extends CrudRepository<DataProfileDTO, String> 

并包装它:

Flux.fromIterable(dataProfileRepository.findById(id)), DataProfileDTO.class))

【讨论】:

以上是关于将 Spring Data 的 ReactiveCrudRepository 应用到 Redis的主要内容,如果未能解决你的问题,请参考以下文章

如何将 @Transactional 与 Spring Data 一起使用?

如何将 spring-data-rest 与 spring websocket 混合到一个实现中

将业务逻辑添加到 spring-data-rest 应用程序

使用 spring-data-rest 将资源添加到集合

将 mongo 查询转换为 spring-data-mongo 查询

“没有找到类型的属性”......将 QueryDslPredicateExecutor 与 MongoDB 和 Spring-Data 一起使用时