java - 无状态 session bean 之间的循环依赖 - 好的做法?

标签 java jakarta-ee ejb cdi

我刚刚在部署两个相互依赖且使用@Inject 的无状态 session bean 时遇到部署错误。

@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 has circular dependencies.

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

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

其次(可能更重要)- 这种做法在架构方面是不好的吗?如果是,您知道有什么模式可以避免这种做法吗?据我目前所知,允许同一层上的业务驱动服务以它们需要的任何方式相互通信。

最佳答案

spec 中所写

The container is not required to support circular chains of dependencies where every bean participating in the chain has a pseudo-scope.

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

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

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

关于java - 无状态 session bean 之间的循环依赖 - 好的做法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31309874/

相关文章:

web-services - 如何在服务器或客户端以编程方式记录 SOAP 消息和 HTTP header ?

java - 什么是 EJB 客户端?

java - Weblogic:在 ejb-jar 文件中找不到 EJB

java - 在 MyXMLHandlerTemp 中使用 SharedPreferences

java - 如何在启动 Android LibGDX 项目时修复 NoClassDefFoundError?

java - 在 Glassfish/Payara 上禁用或隐藏 "ejb-timer-service-app"

java - EJB 2 无状态 session Bean 中的 Spring session 范围 bean

java - DropWizard 和 Camel 集成

jsf - 使用 JEE6 将 EJB 注入(inject) JSF 转换器

java - @Resource 注释在 Tomcat 10.0.10 中不起作用