无状态会话bean之间的循环依赖关系 - 良好实践?

时间:2015-07-09 06:39:07

标签: java java-ee ejb cdi

我在部署两个无状态会话bean时遇到了部署错误,每个会话bean都依赖于另一个并使用@Inject。

@Stateless
class BeanA {
    @Inject 
    BeanB b;

    public void doSomething() {
        b.doSomething();
    }
}

@Stateless
class BeanB {
    @Inject
    BeanA a;

    public void doSomeOtherThing() {
        a.doSomeOtherThing();
    }
}

部署时,我从Glassfish / weld获得此异常:

  

org.jboss.weld.exceptions.DeploymentException:WELD-001443 Pseudo   scoped bean具有循环依赖性。

用@EJB而不是@Inject注入Beans,一切正常。现在我有两个问题。

首先 - 焊接内部会发生什么,这是不允许的?

第二(可能更重要) - 这是建筑方面的不良做法,如果是,你知道任何避免它的模式吗?根据我目前的知识,允许同一层上的业务驱动服务以他们需要的任何方式相互通信。

1 个答案:

答案 0 :(得分:6)

正如spec

所述
  

容器不需要支撑圆形链   参与链的每个bean都有一个依赖关系   伪范围。

在这里,您没有向会话bean添加范围注释,因此它们具有默认范围@Dependent。依赖是伪范围,发生此错误是正常的。

要解决此问题,请将@ApplicationScoped添加到至少一个bean中。实际上,将无状态会话bean放在应用程序上下文中是一种很好的做法,它会阻止CDI在每次注入时围绕现有EJB重新创建其代理。

关于循环,这不是一个坏习惯,但应该只在需要时使用,因为它可以带来更多的复杂性来理解你的应用程序,调试它并防止这些错误。