外部模块ReactiveMongoRepository注入报NoSuchBeanDefinitionException
问题现象
当Repository类放置在外部依赖模块中时,对应Bean无法被Spring识别加载,启动时抛出嵌套的UnsatisfiedDependencyException异常,根异常为NoSuchBeanDefinitionException,提示预期至少存在1个符合自动装配候选条件的Bean。
将该Repository类复制到当前项目本地后,功能可正常运行,但需求是通过外部模块依赖的形式引用该类。
现有代码与项目结构
外部依赖中的Repository定义
@Repository public interface PersonRepository extends ReactiveMongoRepository<Person, String> { }
当前项目配置类与业务类
@Configuration @ComponentScan("outer.package.repository") @EnableMongoRepositories(basePackages = { "outer.package.repository" //"local.package.repository" // 临时本地方案,需替换为外部依赖引用 }) public class MyConfig { } @Service @RequiredArgsConstructor public class PersonService { private final PersonRepository personRepository; // 业务逻辑省略 }
Maven项目目录结构
src main java com example configuration MyConfig.java controller PersonController.java repository PersonRepository.java service PersonService.java MainApplication.java resources test pom.xml
遗漏配置与修复方案
当前配置存在3个核心问题,按优先级修复即可:
- 注解使用错误:Repository继承的是
ReactiveMongoRepository响应式接口,需要使用@EnableReactiveMongoRepositories开启响应式Mongo仓库扫描,普通的@EnableMongoRepositories是同步Mongo仓库的注册注解,无法识别响应式Repository接口。 - 扫描配置位置错误:将仓库扫描注解写在了自定义
MyConfig类上,如果该配置类没有被Spring启动类默认扫描到,整个仓库扫描规则根本不会生效。建议直接将扫描配置加在项目启动类MainApplication上,避免配置类漏扫问题。 - 无效配置冗余:
@ComponentScan是用来扫描@Component/@Service/@Configuration等声明式普通组件的,Spring Data Repository接口是通过动态代理生成Bean的,不需要加@ComponentScan扫描对应包,该配置属于冗余项,可直接删除。
修复后的正确配置示例
将启动类修改为如下写法即可:
@SpringBootApplication @EnableReactiveMongoRepositories(basePackages = { "outer.package.repository", "com.example.repository" }) public class MainApplication { public static void main(String[] args) { SpringApplication.run(MainApplication.class, args); } }
额外校验点
启动前先确认外部依赖的Maven坐标已经正确写入当前项目
pom.xml,且外部依赖构建产物中包含PersonRepository.class文件,不存在打包时类文件被排除的问题。
内容的提问来源于stack exchange,提问作者stakeika
相关产品推荐
相关产品推荐

