将 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 交互并支持响应式支持的最高抽象级别是 ReactiveRedisTemplate
。 ReactiveRedisConnection
是较低的抽象,它使用二进制值 (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 应用程序
将 mongo 查询转换为 spring-data-mongo 查询
“没有找到类型的属性”......将 QueryDslPredicateExecutor 与 MongoDB 和 Spring-Data 一起使用时