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

Wildfly 26升级后Spring误处理EJB注入引发异常原因咨询

问题原因分析:Wildfly 23→26 EJB代理生成逻辑变更

这是Wildfly 23到26之间EJB代理生成机制的变更导致的,并非类加载器变化。

具体差异细节

在Wildfly 23中,EJB代理类(如你看到的MyFooComponent$$$view530)的父类是java.lang.Object。当Spring的CommonAnnotationBeanPostProcessor#buildResourceMetadata遍历类层级时,只会遍历到Object,找不到实现类MyFooComponentImpl里的@Resource、@EJB字段,因此生成的InjectionMetadata的injectedElements和checkedElements为空,Spring不会尝试注入这些字段,EJB容器的原生注入逻辑正常生效。

而Wildfly 26调整了EJB代理的生成逻辑:代理类直接继承自你的EJB实现类MyFooComponentImpl。此时Spring遍历类层级时,会顺着代理类→MyFooComponentImpl→Object的路径,找到实现类中带EJB注解的字段,将它们加入到InjectionMetadata的集合中。Spring会尝试用自身上下文注入这些字段,但这些EJB依赖并未在Spring容器中定义,最终抛出NoSuchBeanDefinitionException。

为什么会有这个变更?

Wildfly 26是兼容Jakarta EE 10的版本,而Wildfly 23基于Jakarta EE 8。这次代理逻辑的调整,大概率是为了适配Jakarta EE规范的更新,优化EJB代理的继承层级兼容性,让代理类更贴近真实实现类的结构,同时可能修复了旧版本代理的某些兼容性问题。

可行的解决方向

  • 自定义BeanPostProcessor,跳过对EJB代理对象的注解字段注入处理;
  • 配置CommonAnnotationBeanPostProcessor,排除EJB相关注解(@EJB、@Resource)的解析,让这些注解仅由EJB容器处理;
  • 在Spring的Bean定义中,通过@Lazy或自定义逻辑,避免Spring触发对EJB代理对象的字段注入。

内容的提问来源于stack exchange,提问作者Ben R.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 17:48:10