Spring 添加 spring-boot-starter-data-redis 依赖项后依赖项注入未找到存储库 bean

Spring dependency injection not finding repository bean after adding spring-boot-starter-data-redis dependency

我有这个 spring 引导项目(版本 2.3.3.RELEASE),它使用 Spring Webflux 和 Spring Data 以及 R2DBC。在我添加以下依赖项之前它工作正常:

implementation 'org.springframework.boot:spring-boot-starter-data-redis'

在此之后,Spring 无法启动,因为它无法解析此对象的依赖关系:

interface BookingCountRepository : ReactiveCrudRepository<BookingCount, String> {
...
}

错误信息如下:

2021-12-22 10:20:59,916 [main]    ERROR [] o.s.b.d.LoggingFailureAnalysisReporter - __***************************_APPLICATION FAILED TO START_***************************__Description:__Parameter 1 of constructor in xx.xx.xx.xx.BookingService required a bean of type 'xx.xx.xx.xx.BookingCountRepository' that could not be found.___Action:__Consider defining a bean of type 'xx.xx.xx.xx.BookingCountRepository' in your configuration._

如果我删除 spring-boot-starter-data-redis 依赖项,问题就会停止。

我的直觉是,这可能是一个依赖地狱问题,org.springframework.boot:spring-boot-starter-data-r2dbc 和 org.springframework.boot:[=33= 之间存在冲突]-boot-starter-data-redis。但我不确定。

有人遇到过这个问题吗?如果有,你是怎么解决这个问题的?

仅供参考:JVM 运行时是 OpenJDK 11,语言是 Kotlin,spring 引导版本是 2.3。3.RELEASE

我找到了解决方案,所以我在这里发帖,因为其他人可能会遇到同样的问题。

问题的原因是在同一个项目中使用了多个spring数据模块(r2dbc和redis)。由于 ReactiveCrudRepository 是可以分配给 Redis 和 R2DBC 的通用接口,因此必须做一些事情来确保 Spring DI 加载正确的 spring 数据模块。

在这种情况下,解决方案是让 BookingCountRepository 直接继承自 R2dbcRepository:

interface BookingCountRepository : R2dbcRepository<BookingCount, String> {
...
}

之后,一切都会正常工作。

文档中的更多信息:

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.multiple-modules

注意:某些方法(例如在 @EnableR2dbcRepositories 注释中通知 basePackages)无效。