You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring 6迁移后请求控制器中嵌套Autowired Bean为空问题

Spring 6 + TomEE 9.1.1迁移后嵌套Autowired Bean空指针排查方案

问题场景

将项目从Spring 5.2.x迁移至Spring 6+Hibernate 5.6,使用JDK17与TomEE 9.1.1服务器,调用RestAPI时出现嵌套Autowired Bean为空的NullPointerException(NPE),涉及Spring CGLIB代理。

报错信息

Caused by: java.lang.NullPointerException: Cannot invoke "com.hp.nieto.services.system.NietoSystemSettingsService.isOTMMShowActiveSessionsEnforced()" 
because "this.nietoSystemSettingsService" is null at com.hp.nieto.business.NietoConfigurationBusinessLogic.isOTMMShowActiveSessionsEnforced(NietoConfigurationBusinessLogic.java:1328) 
~[nieto-business-logic-24.1.0.jar:?]at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
~[?:?]at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) 
~[?:?]at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]at java.lang.reflect.Method.invoke(Method.java:568) 
~[?:?]at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:352) [spring-aop-6.1.2.jar:6.1.2]
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:713) [spring-aop-6.1.2.jar:6.1.2]

代码结构说明

  • CollectionsApi接口标注@Controller与@Api,实现类CollectionsApiController注入的NietoOTMMSessionBussinesLogic可正常调用
  • NietoOTMMSessionBussinesLogic注入的NietoConfigurationBusinessLogic可正常调用
  • NietoConfigurationBusinessLogic中注入的NietoSystemSettingsService为空,触发NPE

项目已开启component-scan配置,旧版本运行正常,尝试添加@PostConstruct手动注入未解决问题。

排查与解决建议

  • 检查CGLIB代理Bean的访问权限:Spring 6对CGLIB代理的Bean字段访问要求更严格,确保NietoConfigurationBusinessLogic中被注入的nietoSystemSettingsService字段为public,或提供public的setter方法——Spring 5可能兼容私有字段注入,但Spring 6在CGLIB代理场景下可能失效
  • 验证Bean的代理约束:检查NietoConfigurationBusinessLogic是否被AOP代理(如事务、切面),若使用CGLIB类代理,确保该类未被final修饰,且被调用的方法不是final方法(CGLIB通过子类代理实现,final方法无法被代理,会导致Spring无法正确注入依赖)
  • 排查Spring与TomEE的依赖冲突:TomEE 9.1.1自带部分EE容器类,通过mvn dependency:tree查看依赖树,排除TomEE中与Spring重复的依赖,避免Spring AOP与TomEE自带字节码操作库冲突
  • 启用Spring容器调试日志:将org.springframework.context日志级别设为DEBUG,查看NietoSystemSettingsService和NietoConfigurationBusinessLogic的Bean创建、注入流程,确认NietoSystemSettingsService是否被正确实例化并注入
  • 替换字段注入为构造器注入:Spring 6推荐使用构造器注入替代字段注入,构造器注入能确保Bean实例化时完成依赖注入,避免代理场景下的字段未初始化问题。示例代码:
    private final NietoSystemSettingsService nietoSystemSettingsService;
    
    public NietoConfigurationBusinessLogic(NietoSystemSettingsService nietoSystemSettingsService) {
        this.nietoSystemSettingsService = nietoSystemSettingsService;
    }
    
  • 检查TomEE类加载配置:TomEE 9.1.1基于Jakarta EE 9,确保项目的Spring配置类和Bean类在TomEE的类加载范围内,避免类加载器隔离导致Bean无法正确注入

内容的提问来源于stack exchange,提问作者SwathiBujuru

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 15:50:22