Spring Boot新增Repository后无法找到GameRepository Bean的问题
问题:Spring无法创建GameRepository类型的Bean
相关代码
GameRepository.java
@Repository public interface GameRepository extends MongoRepository<Game, String> { }
GameRepositoryReactive.java
@Repository public interface GameRepositoryReactive extends ReactiveMongoRepository<Game, String> { }
Game.java
@Data @AllArgsConstructor @NoArgsConstructor @Document(collection = "games") public class Game{ @Id String id; String name; }
GameService.java
private final GameRepositoryReactive gameRepositoryReactive; private final GameRepository gameRepository; public GameService(GameRepository gameRepository, GameRepositoryReactive gameRepositoryReactive) { this.gameRepositoryReactive = gameRepositoryReactive; this.gameRepository = gameRepository; }
错误信息
com.example.service.GameService构造函数的第0个参数需要类型为'com.example.repository.GameRepository'的bean,但未找到。
问题背景
仅使用ReactiveMongoRepository时无此错误,同时引入阻塞式MongoRepository和响应式ReactiveMongoRepository时触发该问题。
原因分析
Spring Boot在同时引入阻塞式MongoDB依赖(spring-boot-starter-data-mongodb)和响应式MongoDB依赖(spring-boot-starter-data-mongodb-reactive)时,默认优先配置响应式Mongo相关Bean,不会自动创建阻塞式的MongoTemplate及对应Repository支持,导致MongoRepository接口无法被实例化为Bean。
解决方案
方案1:显式配置阻塞式MongoRepository支持
创建配置类,手动开启阻塞式MongoRepository扫描并配置MongoTemplate:
@Configuration @EnableMongoRepositories( basePackages = "com.example.repository", repositoryFactoryBeanClass = MongoRepositoryFactoryBean.class ) public class BlockingMongoConfig { @Bean public MongoTemplate mongoTemplate(MongoDatabaseFactory databaseFactory) { return new MongoTemplate(databaseFactory); } }
若需确保响应式Repository正常生效,可单独配置响应式Repository扫描:
@Configuration @EnableReactiveMongoRepositories( basePackages = "com.example.repository", repositoryFactoryBeanClass = ReactiveMongoRepositoryFactoryBean.class ) public class ReactiveMongoConfig { @Bean public ReactiveMongoTemplate reactiveMongoTemplate(ReactiveMongoDatabaseFactory databaseFactory) { return new ReactiveMongoTemplate(databaseFactory); } }
方案2:移除不必要的阻塞式Repository
若业务无需阻塞式数据库操作,直接删除GameRepository接口,并修改GameService移除对应依赖:
private final GameRepositoryReactive gameRepositoryReactive; public GameService(GameRepositoryReactive gameRepositoryReactive) { this.gameRepositoryReactive = gameRepositoryReactive; }
内容的提问来源于stack exchange,提问作者Rony Tesler
相关产品推荐
相关产品推荐

