在有状态 EJB 中注入无状态 EJB 无法按预期工作

发布于 2024-12-21 07:07:26 字数 1482 浏览 4 评论 0原文

我正在尝试将具有默认(@Dependent)范围的无状态ejb注入具有(@SessionScoped)的有状态ejb中。

StatelessBean.java

@Stateless
@LocalBean
public class StatelessBean implements Serializable {

    private static final long serialVersionUID = -9166485686181431397L;

    private long stamp; // + getter/setter

    public StatelessBean() {
        super();
    }

    @PostConstruct
    void init() {
        setStamp(new Random().nextLong());
        System.out.println("Created stateless " + getStamp());
    }

}

StatefulBean.java

@SessionScoped
@Named("bean")
@Stateful
@LocalBean
public class StatefulBean implements Serializable {

    private static final long serialVersionUID = 8358897101178976319L;

    @Inject
    private StatelessBean statelessBean; // + getter/setter

    @PostConstruct
    void init() {
        System.out.println("Created stateful " + new Random().nextLong());
    }

    public long getStamp() {
        return getStatelessBean().getStamp();
    }

}

scope.xhtml

.
.
.
<h:body>
    <h:outputText value="#{bean.stamp}" />
</h:body>
</html>

据我了解,

  1. 除了 @dependent 之外,您无法指定无状态 bean 的范围。
  2. 如果您注入一个 @dependent 作用域对象,它将遵循客户端生命周期。它永远不会被共享。

所以,我期望对于每个会话,容器都会注入不同的 StatelessBean。但它似乎在所有会话中注入相同的一个。

对于为什么会发生这种情况有任何帮助吗?

我正在使用 GlassFish 3.1。

谢谢。

I'm trying to inject a stateless ejb with default (@Dependent) scope, in a stateful ejb with (@SessionScoped).

StatelessBean.java

@Stateless
@LocalBean
public class StatelessBean implements Serializable {

    private static final long serialVersionUID = -9166485686181431397L;

    private long stamp; // + getter/setter

    public StatelessBean() {
        super();
    }

    @PostConstruct
    void init() {
        setStamp(new Random().nextLong());
        System.out.println("Created stateless " + getStamp());
    }

}

StatefulBean.java

@SessionScoped
@Named("bean")
@Stateful
@LocalBean
public class StatefulBean implements Serializable {

    private static final long serialVersionUID = 8358897101178976319L;

    @Inject
    private StatelessBean statelessBean; // + getter/setter

    @PostConstruct
    void init() {
        System.out.println("Created stateful " + new Random().nextLong());
    }

    public long getStamp() {
        return getStatelessBean().getStamp();
    }

}

scope.xhtml

.
.
.
<h:body>
    <h:outputText value="#{bean.stamp}" />
</h:body>
</html>

As I understand,

  1. You cannot specify scope on stateless bean, except @dependent.
  2. If you inject a @dependent scoped object, it follows the client lifecycle. It is never shared.

So, I am expecting that for every session, container will inject different StatelessBean. But it seems to inject same one in all sessions.

Any help on why this is happening?

I'm using GlassFish 3.1.

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

染墨丶若流云 2024-12-28 07:07:26

我认为你的问题是你的无状态 bean 并不是真正的无状态。容器可以自由地重复使用它,因为它应该是无状态的,但您将其解释为错误。

I think your issue is that your stateless bean is not really stateless. The container is free to re-use it since it's supposed to be stateless, but you're interpreting this as an error.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文