【问题标题】:Hold session in stateful EJB 3.1 bean?在有状态 EJB 3.1 bean 中保持会话?
【发布时间】:2012-08-17 04:27:04
【问题描述】:

我正在开发一个尝试结合以下技术的 Java webapp:

  • Java EE 6
  • CDI
  • JSF 2
  • EJB 3.1
  • Spring 安全性

我为我的 JSF 页面提供基于 CDI 的支持 bean(@ViewScoped、@Named)。

我使用@Stateless EJB bean 来完成实际工作。

我只需要很少的会话信息,例如 jSessionCookie(由容器管理)、内部用户名和一些其他内部 ID。现在,我想知道将这个会话信息放在哪里,以便我可以在 JSF 的支持 bean 中访问它,同时也将它提供给无状态 EJB?我应该使用@Stateful EJB 会话bean 还是应该使用@SessionScoped 和@Named 创建基于CDI 的POJO?

有什么最佳做法吗?

【问题讨论】:

  • 不是权威答案,但就我而言,我主要将其保存在 SessionScoped JSF 支持 bean 中。 EJB 几乎不使用这些信息,当他们使用它时,它更加灵活(vg,在一种情况下,搜索条件之一是用户;一些用户只能看到它的项目 - 他们的 id 作为过滤器的一部分传递 - 并且其他人可以看到其他用户的项目-没有 id 作为过滤器的一部分传递-)

标签: java jakarta-ee ejb java-ee-6 ejb-3.1


【解决方案1】:

对于您的特定用例,有状态会话 bean 不是一个好的选择。

请注意,与人们可能声称的相反,有状态会话 bean 肯定不是您通常应该避免的。但是,它们适用于高级用例,例如在处理 JPA 的扩展持久性上下文时。

有状态会话 bean 在这里不起作用的原因是它们不会自动与 HTTP 会话相关联,这似乎是您最关心的问题。您可以向它们添加 @SessionScoped 注释,但是您也可以使用常规托管 bean。您不会使用 SFSB 的任何特定功能。

参见:

您可以使用会话范围的 CDI bean 注入无状态 EJB,但您必须意识到,在同一个应用程序中,您的 EJB bean 将依赖于 HTTP 会话(有时您希望避免这种情况,例如,如果您的 bean也可以从其他上下文中调用)。

【讨论】:

  • 好的,只是为了确保我理解正确。您还会说我应该使用 CDI SessionScoped bean 来保存用户信息,而不是使用 Stateful EJB?
  • 是的,对于这个特定的用例以及您提供给我们的信息,我认为不需要有状态 EJB。 CDI SessionScoped bean 可以注入到其他 CDI bean 以及(无状态)EJB bean 中。
  • 好的,谢谢,只是想确保我没有误读您的答案!
【解决方案2】:

@Stateful EJB 是我尽量远离的东西。我认为行为和状态不应该混为一谈。

我也会选择 SJuan76 的答案并使用 SessionScoped JSF 支持 bean。

【讨论】:

  • 我不同意混合状态和行为总是一件坏事。考虑一下 OOP 的本质是什么:将状态和行为保存在一个地方(在对象中)。
猜你喜欢
  • 2013-04-30
  • 1970-01-01
  • 1970-01-01
  • 2015-03-12
  • 1970-01-01
  • 1970-01-01
  • 2012-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多