7

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

  • Java EE 6
  • CDI
  • JSF 2
  • EJB 3.1
  • 春季安全

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

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

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

有没有最佳实践?

4

2 回答 2

8

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

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

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

参见:

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

于 2012-08-21T21:05:53.330 回答
2

@Stateful EJB 是我试图远离的东西。我相信行为和状态是不应该混为一谈的东西。

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

于 2012-08-21T19:42:56.240 回答