【问题标题】:Circular dependencies between stateless session beans - good practice?无状态会话 bean 之间的循环依赖 - 好的做法?
【发布时间】:2015-09-27 09:06:05
【问题描述】:

我在部署两个相互依赖的无状态会话 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 伪 scoped bean 有循环依赖。

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

首先 - 焊缝内部发生了什么是不允许的?

第二个(可能更重要)——这种做法在架构方面是不是很糟糕,如果是的话,你知道有什么模式可以避免吗?根据我目前的知识,同一层上的业务驱动服务可以以他们需要的任何方式相互通信。

【问题讨论】:

    标签: java jakarta-ee ejb cdi


    【解决方案1】:

    spec中所写

    容器不需要支持循环链 参与链的每个 bean 都有一个依赖项 伪作用域。

    在这里,您没有向会话 bean 添加范围注释,因此它们具有默认范围 @Dependent。 Dependent 是伪作用域,出现这个错误是正常的。

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

    关于循环,这不是一个坏习惯,但应该只在需要时使用,因为它会增加理解应用程序、调试应用程序和防止此类错误的复杂性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-14
      • 1970-01-01
      • 2014-12-26
      • 1970-01-01
      • 1970-01-01
      • 2018-07-17
      • 2011-03-31
      • 1970-01-01
      相关资源
      最近更新 更多