5

我在 JBoss 7.1.1 的 Weld 容器中遇到 CDI 注入问题

我有以下对象模型:

@Stateless
class ServiceEjb {
@Inject
A a;
}

class A {
@Inject
B b;
}

class B {
@Inject
A a;
}

当尝试在我的无状态类中注入 A 或 B 时,注入循环并因 javax.enterprise.inject.CreationException 而崩溃。

我尝试了很多事情(范围界定,A 或 B 上的 @Singleton 但没有成功)。我不想破坏代码,这些注入是有道理的。

任何线索将不胜感激。

4

3 回答 3

12

CDI 标准不要求循环依赖注入,除非循环中至少有一个 bean 具有正常范围最简单的解决方案是给 A 或 B 一个正常的范围。如果你不能给任何一个正常的范围(从代码模型来看,看起来它们都有默认的@Dependent伪范围),你将不得不寻找其他解决方案。发布一个真实的代码示例可能会让我们帮助您提供特定的解决方案,但这里是一个开始:

  • A 和 B 可以合并到同一个类中吗?
  • 是否可以从 A 和 B 中提取一个新类 C,从而使 A 和 B @InjectC 相互替代?

以下是一些 SO 链接,其中包含您可能会发现有用的其他解决方案:

CDI MVP;避免循环依赖

https://stackoverflow.com/questions/14044538/how-to-avoid-cdi-circular-dependency

于 2013-03-08T18:52:31.493 回答
4

我通过明确使用javax.inject.Provider解决了这个问题。虽然我觉得这应该由 WELD 自动在引擎盖下完成,但这对我来说也不是这样。这对我有用并解决了我的相关问题。

class A {
    @Inject
    Provider<B> b; // access with b.get()
}

class B {
    @Inject
    Provider<A> a; // access with a.get()
}

我还没有测试过它,但是使用一个 Provider 来打破循环就足够了,即你不需要在两个类中都使用它。

于 2014-06-23T14:01:17.677 回答
1

您应该注入 Instance<B> 而不是 B(和/或 Instance<A> 而不是 A)

于 2015-01-15T07:11:07.673 回答