Jsf 2 EJB3/JSF2:使用ConversationalScope和有状态EJB设计JSF2应用程序

Jsf 2 EJB3/JSF2:使用ConversationalScope和有状态EJB设计JSF2应用程序,jsf-2,ejb-3.0,java-ee-6,Jsf 2,Ejb 3.0,Java Ee 6,我的用例如下所示: 使用订单行、客户和付款详细信息管理订单 该应用程序包含一个订单列表视图,从中可以打开订单详细信息视图,以编辑现有订单或创建新订单。订单详细信息视图使用视图参数(现有订单id或“无”以指示要创建的新订单) 打开订单详细信息视图时,OrderControllerBean将启动对话范围,具体取决于订单id的可用性,加载或创建新的订单实体。这个bean是一个有状态会话bean,也可以用作一个facade。bean包含处理订单行、客户和付款详细信息以及保存和删除订单的方法。这些方法使用

我的用例如下所示:

使用订单行、客户和付款详细信息管理订单

该应用程序包含一个订单列表视图,从中可以打开订单详细信息视图,以编辑现有订单或创建新订单。订单详细信息视图使用视图参数(现有订单id或“无”以指示要创建的新订单)

打开订单详细信息视图时,OrderControllerBean将启动对话范围,具体取决于订单id的可用性,加载或创建新的订单实体。这个bean是一个有状态会话bean,也可以用作一个facade。bean包含处理订单行、客户和付款详细信息以及保存和删除订单的方法。这些方法使用被设计为无状态会话bean的注入EJB作为某种DAO来处理JPA实体订单、订单行、客户和支付细节

从包含客户信息、付款信息和订单行列表的订单详细信息视图中,用户可以以类似方式导航到订单行详细信息视图添加/编辑订单行以及客户和付款详细信息视图。这些详细视图都使用相同的OrderControllerBean。在“客户”、“订单行”和“付款详细信息”视图中,有“确定”和“取消”按钮,它们不是事务性的

在订单详细信息视图上有一个保存和取消按钮,该按钮应保留对话期间所做的所有修改

我现在的问题是:这种设计合适吗

我不确定以下问题:

如果用户从未使用“保存”或“取消”,会发生什么情况

在转换或会话超时之前,所有内容都会保留吗? 从交易的角度来看,这意味着什么? 这对受管实体意味着什么?
如果用户离开工作场所,稍后回来继续对话,会发生什么情况?如果对话超时,我如何才能优雅地处理这个问题?

在我看来,有状态的bean是一种痛苦,也是问题的根源

最好是在http会话级别处理超时,而不是将此责任交给应用程序服务器(特别是因为http会话超时仍然相关,所以只需添加另一个超时)

您可以使用某种对象缓存替换有状态bean提供的持久状态,或者如果愿意,您可以向数据库中添加sessionid,并在那里跟踪您的对象状态(例如,它可以是保存或丢弃临时对象的特殊表)


总而言之,在web服务器端将事物分开、超时和临时对象,并将EJB用于持久性(JPA)和外观(无状态bean)

为什么在创建订单时需要评估非此即彼的情况?应该有一个按钮,上面写着:neworder,它启动一个弹出表单,另一个可能来自一个datatable行,上面写着“查看订单详细信息”。 设计很好。只是一些调整

  • 您需要创建并维护一个会话范围的对象(称之为
    Visit
    ),在其中存储所有会话相关的资料。我建议您坚持使用JSF会话范围bean,它依赖于http会话,并且可以由容器进行有效管理。JSF会话范围的bean作为简单对象存储在http会话中,因此可以在JSF上下文之外轻松地进行操作。然而,CDI会话范围的bean在CDI之外处理起来更为棘手
  • 我还建议您使用动态加载的页面片段
    或精细primefaces向导组件将订单创建过程分解为多个步骤。通过多步骤创建,您所需要做的就是沿步骤收集数据,只有当您从DTO中的所有步骤中获得所需的所有信息时,才提交事务。将向导DTO保留在单个会话对象中,以便容器可以在超时时进行清理。如果用户从不保存、取消或离开办公桌,会话将自然死亡。如果他及时完成交易,他可以回来继续交易。不确定carlos对无状态会话bean有何反对意见,但根据我的经验,它们是公开业务流程的好方法,因为它们可以以其他方式公开其功能,如Web服务和消息目标(JEE5)最重要的是,这是一个非常好的设计,可以尽可能多地将业务处理从托管bean中分离出来,并放入持久的结构中,如EJB和SpringBean等。

  • 那么,ConversionalScope和有状态会话bean到底是什么呢?如果它们看起来毫无用处,我们必须为自己实现所有的状态保持,那么使用它们的糟糕经历可能会影响我的判断,一件事是向业务逻辑暴露一个入口点,另一件事是向ejb层添加状态保持责任。我希望业务操作尽可能原子化。但再一次,我在有状态EJB方面有过一些不好的经验,主要是在websphere方面,所以我是这个领域的新手,缺乏经验。到目前为止,我在转换范围方面没有什么不好的经验,唯一的问题是在我只使用无状态会话bean并获得分离的实体时失去了持久性上下文。这就是为什么我想切换到facade的有状态会话bean,例如OrderControllerBean。在基本上是数据表的订单列表视图中,最右边的列标题上有一个新的订单按钮,最右边的行列上有一个编辑订单按钮。只是后面的订单详细信息视图是相同的。。。ad 1),我不确定会话范围的bean能起到什么作用。这就是为什么我想使用转换范围。当我开始编辑新订单或现有订单时,转换