代码之家  ›  专栏  ›  技术社区  ›  jmcollin92

CDI注入回路

  •  6
  • jmcollin92  · 技术社区  · 12 年前

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

    我得到了以下对象模型:

    @Stateless
    class ServiceEjb {
    @Inject
    A a;
    }
    
    class A {
    @Inject
    B b;
    }
    
    class B {
    @Inject
    A a;
    }
    

    当试图在我的无状态类中注入A或B时,注入循环并导致javax.enterprise.inject.CreateException崩溃。

    我尝试了很多事情(范围界定,@Singleton关于A或B,但没有成功)。 我不想破坏密码,这些注射是有意义的。

    任何线索都将不胜感激。

    3 回复  |  直到 12 年前
        1
  •  12
  •   Community Mohan Dere    8 年前

    Circular dependency injection is not required by the CDI standard ,除非循环中至少有一个bean具有 normal scope . 对此,最简单的解决方案是给A或B一个正常的范围。 如果您不能给出任何一个正常的作用域(从代码模型来看,它们似乎都有默认的 @Dependent 伪作用域),您将不得不寻找其他解决方案。发布一个真实的代码示例可能会让我们为您提供特定的解决方案,但这里是一个开始:

    • A和B可以合并到同一个班吗?
    • 可以从a和B中提取一个新的类C吗?这样a和B都可以 @Inject C而不是彼此?

    以下是一些与其他解决方案的SO链接,您可能会发现这些链接很有帮助:

    MVP with CDI; avoiding circular dependency

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

        2
  •  5
  •   jan    11 年前

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

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

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

        3
  •  1
  •   Sheepy    11 年前

    您应该注入一个实例<B>而不是B(和/或实例<A>而不是A)