将@Stateful和@SessionScoped用于购物车EJB

时间:2014-04-01 07:37:53

标签: jsf java-ee ejb stateful-session-bean

我知道在Web应用程序中使用有状态与无状态EJB存在很多争议。

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

在stackoverflow中,我发现了许多有趣的答案,例如The Shopping Cart dilemma in JavaEE,这些答案通常会说:

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

但是......如果您只是开发爷爷的电子商务网站,只需坚持使用HttpSession / SessionScoped cdi托管bean,并在SLSB中编写业务方法,它们更有效率,等等......

然而,由于我还处于学习和发现阶段,我只想亲自试试SFSB尝试建立一个简单的购物车。

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

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

它会如上所述起作用吗? CDI会为每个网络会话创建一个SFSB吗?

2 个答案:

答案 0 :(得分:6)

@SessionScoped适用于@Named个bean,@Stateful适用于@EJB个bean。如果我没错,你就不能用两者注释1个bean。如果您想使用@Stateful,只需使用ShoppingCart@EJB对您的@Local bean进行注释,然后在ShopController中引用它。像这样:

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

    // Getters and Setters
}

@Local
@Stateful
public class ShoppingCart {
    ...
}

答案 1 :(得分:-1)

不要浪费时间学习如何将SFSB用于Web应用程序。您很快就会遇到可扩展性问题。为什么要学习如何创建使用不必要的服务器资源的应用程序?

即使您的托管bean也不应该是SessionScoped。最多只创建一个非常精简的SessionScoped MB,其中包含小型用户数据以跟踪它,所有其他MB应该是请求,视图范围。

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