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

为何bean-discovery-mode=annotated时无法解析AiServiceFactory依赖?

问题原因分析与解决方案

核心原因:annotated模式的bean发现规则与注解兼容性

CDI 2.0中,bean-discovery-mode="annotated"的核心规则是:仅将带有「bean定义注解」的类注册为CDI bean。这些注解包括:

  • 标准作用域注解:@RequestScoped、@SessionScoped、@ApplicationScoped等
  • @Named注解
  • 自定义@Stereotype注解
  • @Decorator、@Interceptor等特殊注解

你遇到的问题,最可能的原因是注解包版本不匹配:
你的beans.xml是CDI 2.0(Java EE 8)版本,对应的标准作用域注解应该是javax.enterprise.context.ApplicationScoped。如果你的AiServiceFactory使用的是Jakarta EE版本的jakarta.enterprise.context.ApplicationScoped(适用于CDI 3.0+),CDI 2.0容器无法识别该注解,不会将AiServiceFactory视为CDI bean——因此在annotated模式下无法被发现;而all模式会忽略注解,将所有类都当作bean处理,所以能找到该类。

其他可能性(概率较低)

  1. 上下文就绪时机问题:在AfterBeanDiscovery阶段,虽然bean已完成注册,但ProducerContext中的Instance可能无法获取到尚未实例化的应用作用域bean。不过这种情况通常会抛出实例化异常,而非依赖未满足异常。
  2. 类可见性或扫描路径问题:若AiServiceFactory所在包未被CDI扫描器覆盖,也会导致annotated模式下无法发现。但all模式能找到说明扫描路径是正确的,此情况可能性低。

解决方案

  1. 统一注解与CDI版本:
    • 若继续使用CDI 2.0(Java EE 8),确保AiServiceFactory的@ApplicationScoped注解来自javax.enterprise.context包。
    • 若需升级到Jakarta EE,将beans.xml版本改为3.0,同时将所有CDI注解替换为jakarta.enterprise.context等Jakarta包路径下的注解。
  2. 强制标记为可发现bean:
    在AiServiceFactory上额外添加@Named注解,确保在annotated模式下被CDI识别为bean:
    @ApplicationScoped
    @Named
    public class AiServiceFactory {...}
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 03:44:57