【问题标题】:Encapsulating stateless beans inside a stateful session在有状态会话中封装无状态 bean
【发布时间】:2013-08-27 23:40:05
【问题描述】:

我有一个使用 EJB 的 Java EE 应用程序,并通过无状态 EJB 执行大部分功能。

我要求所有用户也有一个活动会话,我想知道使用 bean 的最佳方式是什么。

目前,我有一个命令行客户端,除了使用有状态 bean 登录系统外,它还直接使用无状态 bean。

我想知道是否应该让客户端通过有状态 bean 执行所有功能,这样除非存在活动会话,否则无法执行任何功能。
这对我个人来说更有意义。

我只是不太确定什么设计是“正确的”或更好的设计。
如果我继续让客户端使用无状态 bean,那么我必须有办法让这些无状态 bean 检查客户端是否有活动会话。

【问题讨论】:

  • 为什么需要一个 stateful 会话 bean 来进行日志记录?您的会话中还有什么(= 有什么要求)?
  • 用于登录、认证。基本上所有系统功能都是同一个会话的一部分(用户需要先登录才能执行任何功能)

标签: java jakarta-ee ejb-3.1 stateless-session-bean stateful-session-bean


【解决方案1】:

如果您的要求是经过身份验证的用户,那么无状态会话 bean 就可以了:

  • 您可以在 EJB 中调用 SessionContext.getCallerPrincipal()(用于记录等目的)
  • 您可以以声明方式强加授权(在 EJB 方法上使用 @RolesAllowed 注释)

所以我没有理由切换到有状态会话 bean。它可能不相关,但有状态会话 bean 会消耗服务器端的资源,因此应该有一个令人信服的理由这样做。

到目前为止,When to use Stateful session bean over Stateless session bean? 的相关问题没有收到任何答案,我认为 no answer 在这种情况下也是一个答案

【讨论】:

    【解决方案2】:

    即使您只是调用无状态 bean,会话仍然存在。是否调用无状态或有状态 bean 的选择应该只与您是否需要在方法调用之间保持状态有关。尝试注入 SessionContext 并注意会有一个主体,即使它是匿名的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-02
      • 1970-01-01
      • 1970-01-01
      • 2011-03-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多