Kotlin集成Micronaut修改@Named指定Bean名后报无对应Bean错误
问题排查结果
报错的核心原因是仅修改了依赖注入点的@Named限定名,未同步修改Bean注册到容器时声明的名称,容器中不存在名为test-index-new的BigramIndexManagerService类型Bean,因此抛出匹配失败错误。你之前配置的注解处理器、yml参数都没有问题,不需要调整。
修复方案
- 定位
BigramIndexManagerService的Bean定义位置
你贴出的BigramIndexManagerService类本身没有加任何Bean声明注解,且原名称test-index可以正常注入,说明这个Bean是通过@Factory标注的工厂类生产的,找到类似如下的生产代码:
将工厂方法上@Factory class AppBeanFactory { @Bean @Named("test-index") // 这是未同步修改的Bean名称配置 fun provideBigramIndexService(): BigramIndexManagerService { return BigramIndexManagerService() } }@Named注解的值从test-index修改为test-index-new,和注入点的名称保持完全一致即可。 - 如果你是直接在服务类上声明Bean,直接给类加上对应名称的注解即可:
@Singleton @Named("test-index-new") class BigramIndexManagerService { // 业务服务逻辑 } - 改完配置后如果还是报错,执行
./gradlew clean build清空历史编译缓存,重新触发Micronaut注解处理生成Bean定义即可。
注意:Micronaut对
@Named限定符是严格字符串匹配,注入点的名称必须和Bean注册时声明的名称完全一致,仅修改单侧名称必然会触发找不到Bean的错误。排查时可以按提示开启io.micronaut.context.condition的trace日志,能直接看到所有已注册Bean的名称和加载状态。
内容的提问来源于stack exchange,提问作者Mohamed Niyaz
相关产品推荐
相关产品推荐

