4

我知道有很多关于在 Web 应用程序中使用有状态和无状态 EJB 的争论。

购物车是最常见的用例:Oracle 的 Java EE 示例也在官方文档中大量使用它。

在 stackoverflow 上,我发现了很多有趣的答案,比如JavaEE 中的购物车困境,通常会这样说:

好的... SFSB 适用于企业、复杂的场景,例如,如果您想与其他应用程序共享它们并使它们不仅可用于 JSF/Web 客户端

但是...如果您只是在开发您爷爷的电子商务网站,请坚持使用HttpSession / SessionScoped cdi-managed bean,并在SLSB中编写您的业务方法,因为它们更高效,等等...

但是,因为我还处于学习和发现阶段,所以我只是想尝试一下 SFSB,一个人尝试构建一个简单的购物车。

我看到一个有趣的教程建议在 HttpSession 中存储一个 JNDI 检索到的 @Stateful 购物车 ejb 接口实例,当 Web 客户端第一次需要它时,然后在 Web 会话期间照常使用它。在我的 JSF 表示层中,我想我会有一个 @SessionScoped @Named bean(我们称之为ShopController),并且在它的初始化中,将有状态 ejb 的一个实例存储在一个实例变量中。

我想知道是否可以通过使用@SessionScoped CDI 注释将@Stateful bean 直接绑定到http 会话。

它会像上面描述的那样工作吗?CDI 是否会为每个网络会话创建一个 SFSB?

4

2 回答 2

6

@SessionScoped@Named豆子,@Stateful@EJB豆子。如果我没记错的话,你不能同时注释 1 个 bean。如果你想使用,只需用and@Stateful注释你的ShoppingCartbean,然后在你的. 像这样的东西:@EJB@LocalShopController

@Named
@SessionScoped
public class ShopController {
    ...
    @EJB
    private ShoppingCart cart;
    ...

    // Getters and Setters
}

@Local
@Stateful
public class ShoppingCart {
    ...
}
于 2014-04-01T10:12:56.073 回答
0

不要浪费时间学习如何将 SFSB 用于 Web 应用程序。您很快就会遇到可伸缩性问题。你为什么要学习如何制作一个使用不必要的服务器资源的应用程序?

甚至您的托管 bean 也不应该是 SessionScoped。最多只创建一个非常薄的带有少量用户数据的 SessionScoped MB 来跟踪它,所有其他的都应该是请求、视图范围的。

您的问题的答案是肯定的,您可以使用 CDI 将 SessionScoped MB 绑定到 SFSB EJB。但这对于 Web 应用程序来说并不是一个好的架构。

于 2014-04-01T18:33:18.237 回答