由于已添加到WeldDeployment.additionalClasses存档中,因此在Bean存档中未检测到合成Bean

问题描述

我已经和Weld和CDI玩了几个月了,最近遇到了以下问题。

问题情况

  • 使用Weld SE 3.1.5.Final
  • 创建了一个CDI扩展程序,该扩展程序使用SomeBean添加一个bean(@Observes AfterBeandiscovery abd
  • SomeBean一个自定义bean,具有ArrayList.class作为Class并返回1个限定符(@CustomQualifier)。
  • 然后,另一个bean(DifferentBean)声明一个@Inject @CustomQualifier ArrayList<String> variableName;
  • 该注入点由于Unsatisfied dependencies而失败。

调查

从Bean验证报告中,我能够确定:

  • Weld创建了2个Bean存档
    1. 使用:
      • 标识符:MyProject \ build \ classes \ java \ main
      • 类型:全部
      • Beans.xml:未定义版本。
    2. 使用:
      • 标识符:org.jboss.weld.environment.deployment.WeldDeployment.additionalClasses
      • 类型:带注释的
      • Beans.xml:没有bean.xml
  • CDI扩展是位于存档1中的Bean。
  • DifferentBean实例化的结果位于存档1中。
    • 此bean具有:
      • 种类:已管理
      • 类别:my.package.DifferentBean
      • 限定词:@Default
      • 范围:@Dependent
  • SomeBean实例化的结果位于存档2中。
    • 此bean具有:
      • 种类:合成
      • 类:j.u.ArrayList
      • 限定词:@CustomQualifier
      • 范围:@ApplicationScoped

原因

基于此,我假设出于某种原因,将我的自定义扩展名添加SomeBean添加到档案2中,因此无法从DifferentBean所在的档案1中访问。

如果该评估是正确的,我该如何解决

解决方法

我找到了问题所在。 我期望Weld将ArrayList.class的泛型解析为ArrayList。删除通用后,这种情况没有发生。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...