【问题标题】:CDI @Inject Instance @Any - But instance never populated with instancesCDI @Inject Instance @Any - 但实例从未填充实例
【发布时间】:2015-06-29 17:23:37
【问题描述】:

为什么“实例”从不迭代任何实现?我错过了什么?

JBoss EAP 6.3.0.GA (AS 7.4.0.Final-redhat-19)

public interface Simple { }
public class SimpleA implements Simple { public SimpleA() { } }
public class SimpleB implements Simple { public SimpleB() { } }
public class SimpleUser {
    @Inject @Any Instance<Simple> instance;

    @PostConstruct public void init() {
        for (final Simple simple : instance) {
            System.out.println(simple);
        }
    }
}

【问题讨论】:

  • 你的 jar/war 的 META-INFWEB-INF 目录中是否有 beans.xml,它提供了 bean? JBoss 7.x/EAP 6.x 使用 CDI 1.0,所以所有的 bean 都为 CDI 挑选。
  • 谢谢,我有一个,但它是空的。我认为没有必要让它工作。其他注入正在工作,例如 @EJB 没有在 beans.xml 中添加它们。我现在打印了一个实现,但不是两个。添加“@ Default”和“@ Alternative”不会改变任何事情。我想我错过了一些基本的东西。顺便说一句,如果有一个实现@Inject 也可以......
  • 我在示例战争中尝试了您的代码并且它有效。上面的代码就OK了。
  • 好的,谢谢,真奇怪。我终于让它工作了。也许我使用 DeltaSpike 并且有几个 EJB 和带有 RestEasy 的 Web 服务的事实干扰了这一点,但是在为每个实现创建生产者方法之后,我可以迭代实现。对我来说,这有点失败,因为您必须为每个实现提供一个方法... @Produces public SimpleA getSimpleA(@New final SimpleA simpleA) { return simpleA; }
  • 通常,所有提到的组件都可以很好地协同工作。 DeltaSpike 有一个 @Veto 注释来禁用某些 bean。 CDI bean 可以在 CDI 的可移植扩展中禁用。根据您的课程路径,可能有一些东西会否决您的 bean,但这不太可能。

标签: java jboss7.x cdi


【解决方案1】:

如果它对其他人有帮助,我也在使用 Deltaspike 1.5.2 并且遇到了同样的问题(如果我删除 Deltaspike,我就不再有问题了)。

在我的情况下,添加生产者方法并没有解决它。环顾四周后,我 BeanProvider 解决了问题,但远非优雅。

https://deltaspike.apache.org/documentation/core.html#BeanProvider

我不得不打电话

List<MyServiceInterface> myServiceList = BeanProvider.getContextualReferences(MyServiceInterface.class, false, false);

可能有更好的方法。我注意到 Deltaspike 默认情况下会打开一堆扩展,但找不到有关如何禁用我不使用的扩展的文档,因为我怀疑其中一个可能会导致此问题。

【讨论】:

  • DeltaSpike 不会改变该区域的行为。这甚至是不可能的(在 bean/s 上没有否决权)。一些 CDI 容器只是在 Inject+Any+Instance 的情况下存在错误,但这与 DeltaSpike 无关。
猜你喜欢
  • 2013-12-23
  • 2018-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多