Применить Spring Data ReactiveCrudRepository к Redis
Я играю с Spring Boot 2 с webflux
. Я пытаюсь использовать ReactiveSortingRepository
чтобы упростить redis ops.
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
Я пошел googling, кажется, что Spring Data Redis 2.0 не упоминает поддержку реактивного репозитория. Мне интересно, что-то я сделал неправильно в своем коде или Spring Data Redis 2.0, пока не поддерживает ReactiveCrudRepository.
Ответы
Ответ 1
Согласно документации Spring для поддержки Reactive Redis, самый высокий уровень абстракции для взаимодействия с Redis с реактивной поддержкой - ReactiveRedisTemplate
. ReactiveRedisConnection
- это более низкая абстракция, которая работает с двоичными значениями (ByteBuffer) в качестве входных и выходных данных.
Там не упоминается поддержка реактивных репозиториев. Вы также можете ознакомиться с официальными реактивными примерами в репозитории github с пружинными данными.
Чтобы все это работало, вам нужно иметь реактивную поддержку в драйвере, который вы используете, - в настоящее время это будет салат.
Хотя это и не идеально, альтернативой является Flux.fromIterable()
. Вы можете использовать блокирующий репозиторий и обрабатывать результат реактивным способом.
public interface DataProfileRepository extends CrudRepository<DataProfileDTO, String> {
}
И оберните его:
Flux.fromIterable(dataProfileRepository.findById(id)), DataProfileDTO.class))