@Resource 按字段名查找的坑
Spring Boot 启动失败BeanNotOfRequiredTypeExceptionnacosGracefulShutdownDelegate连环报错分析一、错误现象应用启动时直接失败控制台打印大量异常堆栈主要包括两类错误1. 核心错误导致启动失败org.springframework.beans.factory.BeanCreationException: Error creating bean with name assessmentIndicatorSyncJob: Injection of resource dependencies failed Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name assessmentIndicatorCalcServiceImpl: Injection of resource dependencies failed Caused by: org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named tenantFrameworkService is expected to be of type ...TenantCommonApi but was actually of type ...TenantFrameworkServiceImpl2. 次生错误Context 关闭时反复出现org.springframework.beans.factory.BeanCreationNotAllowedException: Error creating bean with name nacosGracefulShutdownDelegate: Singleton bean creation not allowed while singletons of this factory are in destruction该错误重复出现5~6 次随后应用退出。二、错误根因分析2.1 定位问题代码ServicepublicclassAssessmentIndicatorCalcServiceImplimplementsAssessmentIndicatorCalcService{ResourceprivateTenantCommonApitenantFrameworkService;// ← 问题在这里// ...}2.2Resource注入机制Resource的查找顺序是先按 bean name字段名匹配匹配不到再按类型匹配因为字段名叫tenantFrameworkServiceSpring 就去容器中找名为tenantFrameworkService的 Bean。2.3 容器中实际存在什么容器中确实有一个 Bean 叫tenantFrameworkService但它来自yudao-spring-boot-starter-biz-tenant模块// TenantFrameworkServiceImpl.javaRequiredArgsConstructorpublicclassTenantFrameworkServiceImplimplementsTenantFrameworkService{// 它实现的是 TenantFrameworkService 接口privatefinalTenantCommonApitenantApi;// 内部包装了 TenantCommonApi}而代码中声明的类型是// TenantCommonApi.java — 这是一个 Feign 客户端接口FeignClient(nameRpcConstants.SYSTEM_NAME)publicinterfaceTenantCommonApi{// RPC 远程调用接口CommonResultTenantRespDTOgetTenant(RequestParam(id)Longid);}2.4 类型关系类/接口类型说明TenantCommonApiFeign 客户端接口RPC 远程调用通过 HTTP 调用 system-serverTenantFrameworkService本地服务接口定义本地租户服务方法TenantFrameworkServiceImpl本地服务实现类实现TenantFrameworkService内部包装了TenantCommonApi并加了 Guava 缓存TenantFrameworkServiceImpl不实现TenantCommonApi它们是两个完全不同的类型体系。2.5 结论字段名声明的类型容器中实际匹配到的 Bean结果tenantFrameworkServiceTenantCommonApiTenantFrameworkServiceImpl类型TenantFrameworkService❌BeanNotOfRequiredTypeException三、Nacos 报错为什么出现3.1 事件链① BeanNotOfRequiredTypeException (tenantFrameworkService 类型不匹配) ↓ ② ApplicationContext.refresh() 失败 → 调用 doClose() 清理 ↓ ③ doClose() 发布 ContextClosedEvent ↓ ④ Nacos 的 nacosGracefulShutdownDelegate 监听器收到事件 ↓ ⑤ 该监听器尝试 getBean() → 但 BeanFactory 已在销毁状态 ↓ ⑥ BeanCreationNotAllowedException: Singleton bean creation not allowed...3.2 为什么重复 5~6 次看堆栈中间NamedContextFactory.destroy() ← Spring Cloud LoadBalancer 的子容器销毁 → AbstractApplicationContext.close() → doClose() 发布 ContextClosedEvent → nacosGracefulShutdownDelegate 再次尝试 getBean()NamedContextFactorySpring Cloud LoadBalancer会为每个服务创建独立的子 ApplicationContext。销毁时每个子 Context关闭都会发布ContextClosedEventNacos 监听器又注册在每个子 Context 中所以触发多次。3.3 错误性质错误性质原因BeanNotOfRequiredTypeException根因Resource字段名导致按名称匹配到错误的 BeanBeanCreationNotAllowedException次生启动失败后关闭 Context 时Nacos 在销毁阶段试图 getBeanNacos 线程池/HttpClient 销毁日志正常清理容器销毁时的正常善后动作四、解决方案4.1 修复方法将字段名改为不与任何 Bean 名冲突让Resource退化为按类型匹配// 修改前ResourceprivateTenantCommonApitenantFrameworkService;// ❌ 按名称匹配到 TenantFrameworkServiceImpl// 修改后ResourceprivateTenantCommonApitenantCommonApi;// ✅ 按类型匹配到 TenantCommonApi 的 Feign Bean同时删除无用的 import// 删除这行从未使用importcn.iocoder.yudao.framework.tenant.core.service.TenantFrameworkService;4.2 修复后的调用// 使用处同步修改CommonResultTenantRespDTOcommonResulttenantCommonApi.getTenant(TenantContextHolder.getTenantId());4.3 原理说明字段名改为tenantCommonApi后Spring 找不到名为tenantCommonApi的 Bean于是退回到按类型匹配正确匹配到 Feign 框架自动创建的TenantCommonApi代理 Bean注入成功。五、教训与最佳实践5.1ResourcevsAutowired注解默认匹配方式注意事项Resource先按 bean name再按 type字段名会影响注入结果Autowired先按 type再按 name字段名一般不影响注入除非有多个同类型 Bean5.2 字段命名建议字段名不要与其他已知的 Bean 名相同否则Resource会按名称匹配字段名应该反映声明的类型而不是想要的功能例如TenantCommonApi类型的字段就叫tenantCommonApi而不是tenantFrameworkService5.3 遇到类似错误时的排查思路找到最底层的Caused by而非最上面的报错看BeanNotOfRequiredTypeException中的三个关键信息Bean 名tenantFrameworkService期望类型TenantCommonApi实际类型TenantFrameworkServiceImpl检查字段声明是否与 Bean 名冲突上层的 Nacos 报错通常是次生灾害忽略即可六、参考Spring Resource AnnotationSpring Cloud Nacos Graceful ShutdownDefaultSingletonBeanRegistry 源码

相关新闻

基于DRV2605L评估套件的多驱动器触觉反馈系统设计与实战

基于DRV2605L评估套件的多驱动器触觉反馈系统设计与实战

1. 项目概述与核心价值 如果你正在设计下一代智能手表、游戏手柄或者车载中控屏,想让用户每一次点击、滑动和确认都获得清晰、细腻且有层次的物理反馈,那么触觉反馈技术就是你绕不开的核心。传统的“嗡嗡”震动早已过时,现代交互追求的是精准…

2026/7/23 11:49:37 阅读更多 →
网络恶搞事件的技术解析:从AI生成到传播分析

网络恶搞事件的技术解析:从AI生成到传播分析

这次我们来看一个很有意思的网络现象——"网友恶搞引发热议,谁干的?💀"事件。这个事件最近在社交媒体上引发了广泛讨论,涉及网络恶搞行为的边界、传播机制以及背后的技术实现方式。作为技术从业者,我们更关注…

2026/7/23 11:49:37 阅读更多 →
大模型Agent在智能客服中的架构设计与优化实践

大模型Agent在智能客服中的架构设计与优化实践

1. 大模型Agent与智能客服的现状与挑战最近两年,大模型技术的爆发式发展正在彻底改变智能客服领域的面貌。作为从业者,我亲眼见证了从传统规则引擎到基于大模型的对话系统的转变过程。以美团智能客服为例,其日均处理对话量已突破千万级别&…

2026/7/23 11:48:37 阅读更多 →

最新新闻

边缘计算:让数据“就近处理“的智慧

边缘计算:让数据“就近处理“的智慧

631 | 边缘计算:让数据"就近处理"的智慧 想象你在外地出差,需要盖一个公司公章。 传统模式:你把文件寄回上海总部,等盖好再寄回来。 耗时:3-5天 问题:急件怎么办?文件丢了怎么办? 本地模式:公司在外地设有分部,分部有权盖分公司的章。 耗时:当天搞定 优…

2026/7/23 12:08:50 阅读更多 →
低代码平台:让“人人都是开发者“成为可能?

低代码平台:让“人人都是开发者“成为可能?

632 | 低代码平台:让"人人都是开发者"成为可能? 想象你要装修房子。 传统方式:请专业设计师 → 出图 → 施工队 → 验收 耗时:1-3个月 费用:几十万 问题:你想要什么效果,得用设计师的语言描述 宜家模式:模块化组件 → 拖拽组装 → 自行安装 耗时:1周 费用…

2026/7/23 12:08:50 阅读更多 →
MSPM0 SPI模块深度解析:从基础原理到实战配置与调试

MSPM0 SPI模块深度解析:从基础原理到实战配置与调试

1. 项目概述与SPI核心价值在嵌入式开发领域,微控制器与外设之间的高效、可靠通信是项目成败的关键。无论是读取传感器数据、配置无线模块,还是与外部存储器交换信息,都需要一个稳定且灵活的通信接口。串行外设接口(SPI&#xff09…

2026/7/23 12:08:50 阅读更多 →
收到的PDF加了密码,输入密码才能打开?其实有两道锁,很多人只遇到第一道

收到的PDF加了密码,输入密码才能打开?其实有两道锁,很多人只遇到第一道

同事发来一份文件,双击打开,弹出一个框让你输密码。打电话去问,对方说“我没设密码啊”。你试了几个常用组合,都不对,文件就这么卡在那,看不了。这个情况其实比你想象的更常见。原因不在于同事故意设了密码…

2026/7/23 12:08:50 阅读更多 →
AI模型推理参数调优:精度、速度与显存的平衡艺术

AI模型推理参数调优:精度、速度与显存的平衡艺术

1. 项目概述:推理参数调优的核心价值在AI模型部署的实际场景中,我们常常面临一个经典三角困境:推理精度、响应速度和显存占用三者难以兼得。上周在部署一个工业质检模型时,就遇到了这样的问题——当把batch_size调到32以获得最佳吞…

2026/7/23 12:08:50 阅读更多 →
SOLIDWORKS曲面切除功能详解与应用实践

SOLIDWORKS曲面切除功能详解与应用实践

1. SOLIDWORKS曲面切除功能深度解析曲面切除是SOLIDWORKS中一项强大的建模功能,它允许我们使用曲面作为"刀具"来切割实体模型。与传统的拉伸切除或旋转切除不同,曲面切除可以实现极其复杂的几何形状切割,特别适合处理有机形态、流体…

2026/7/23 12:07:50 阅读更多 →

日新闻

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:25 阅读更多 →
AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

更多请点击: https://codechina.net 第一章:AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析 在对2,346篇跨行业AI生成文案的A/B测试数据进行聚类分析后,我们发现&#xff1…

2026/7/23 0:01:26 阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:01:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 19:43:43 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/22 12:54:44 阅读更多 →

月新闻