Spring @Resource注入服务失败 报空指针及托管Bean资源注入错误
托管Bean资源注入失败故障排查
核心报错
Error injecting resources into managed bean 'X',本次故障中具体报错指向BriefcaseService
相关代码实现
NeoEntityService类
@Service public class NeoEntityService { @Override public List<NeoEntity> getRenamedEntitiesForUser(DirectoryUser user, String siloId) throws OxwayException { List<NeoEntity> entities = new ArrayList<NeoEntity>(); return entities; } }
BriefcaseService类(注入NeoEntityService)
@Service("briefcaseService") public class BriefcaseService { @Resource private NeoEntityService neoEntityService; public void test(DirectoryUser user, String siloId) { try { System.out.println(neoEntityService.getRenamedEntitiesForUser(user, siloId).size()); } catch (OxwayException e) { e.printStackTrace(); } } }
故障表现
启动服务调用BriefcaseService时触发两类报错:
- Servlet异常:
javax.servlet.ServletException: Error injecting resources into managed bean 'BriefcaseService' - 空指针异常:
java.lang.NullPointerException,报错位置为BriefcaseService.java第9行,即调用neoEntityService方法的代码行 - 实际故障特征:
BriefcaseService中注入的neoEntityService实例为null
已做排查
- 尝试为
NeoEntityService添加@Service("neoEntityService")显式指定Bean名称,问题未解决 - 同一份代码在其他同事设备上可正常运行,排除注解写法错误,初步定位为本地环境配置问题
根因排查顺序&修复方案
按同代码跨环境运行异常的概率从高到低排查:
- Spring包扫描路径漏扫
最高发原因:本地Spring配置(XML配置的context:component-scan、SpringBoot启动类的@ComponentScan配置)中,扫描的基础包路径没有覆盖NeoEntityService所在的包,导致Spring容器未初始化NeoEntityService实例,注入失败。
修复:核对本地Spring配置的包扫描范围,确保NeoEntityService、BriefcaseService所在包都在扫描路径内,无漏扫情况。 - 本地依赖缓存异常/版本冲突
本地Maven/Gradle依赖缓存损坏,或者存在spring-beans、spring-context、javax.annotation-api(提供@Resource注解)相关包的版本冲突、多版本共存,导致@Resource注解的依赖注入逻辑未正常生效。
修复:清空本地依赖缓存后重新拉取官方依赖,和正常运行的同事对齐所有依赖版本,排查并排除重复引入的低版本冗余依赖。 - Bean实例获取方式错误
如果调用BriefcaseService时是手动通过new BriefcaseService()创建实例,而非从Spring容器中获取托管的Bean实例,那么实例内的@Resource依赖不会被Spring注入,会直接出现null。
修复:确保调用时使用的是Spring容器托管的briefcaseServiceBean,禁止手动new托管类的实例。 - 外置容器类加载冲突
如果使用Tomcat等外置Web容器部署项目,检查本地容器的lib目录下是否存在和项目内重复的Spring相关包,导致类加载时出现版本冲突,注解注入逻辑失效。
修复:清理容器lib目录下和项目重复的冗余依赖,保证容器和项目的类加载隔离正常。
内容的提问来源于stack exchange,提问作者user19013678
相关产品推荐
相关产品推荐

