为何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处理,所以能找到该类。
其他可能性(概率较低)
- 上下文就绪时机问题:在
AfterBeanDiscovery阶段,虽然bean已完成注册,但ProducerContext中的Instance可能无法获取到尚未实例化的应用作用域bean。不过这种情况通常会抛出实例化异常,而非依赖未满足异常。 - 类可见性或扫描路径问题:若
AiServiceFactory所在包未被CDI扫描器覆盖,也会导致annotated模式下无法发现。但all模式能找到说明扫描路径是正确的,此情况可能性低。
解决方案
- 统一注解与CDI版本:
- 若继续使用CDI 2.0(Java EE 8),确保
AiServiceFactory的@ApplicationScoped注解来自javax.enterprise.context包。 - 若需升级到Jakarta EE,将
beans.xml版本改为3.0,同时将所有CDI注解替换为jakarta.enterprise.context等Jakarta包路径下的注解。
- 若继续使用CDI 2.0(Java EE 8),确保
- 强制标记为可发现bean:
在AiServiceFactory上额外添加@Named注解,确保在annotated模式下被CDI识别为bean:@ApplicationScoped @Named public class AiServiceFactory {...}
内容的提问来源于stack exchange,提问作者ravenskater
相关产品推荐
相关产品推荐

