在有状态EJB 3.1 bean中保持会话?

时间:2012-08-21 19:07:44

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

我正在尝试结合以下技术的Java webapp:

  • Java EE 6
  • CDI
  • JSF 2
  • EJB 3.1
  • Spring Security

我为我的JSF页面提供基于CDI的后台bean(@ViewScoped,@ Name)。

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

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

有没有最佳做法?

2 个答案:

答案 0 :(得分:8)

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

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

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

见alo:

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

答案 1 :(得分:2)

@Stateful EJB是我试图远离的东西。我认为行为和国家是不应该混合的事情。

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