我正在尝试结合以下技术的Java webapp:
我为我的JSF页面提供基于CDI的后台bean(@ViewScoped,@ Name)。
我使用@Stateless EJB bean来完成实际的工作。
我只需要很少的会话信息,如jSessionCookie(由容器管理),内部用户名和一些其他内部ID。现在,我想知道在哪里放置这个会话信息,以便我可以在JSF的支持bean中访问它,还可以将它提供给无状态EJB?我应该使用@Stateful EJB会话bean还是应该使用@SessionScoped和@Named创建基于CDI的POJO?
有没有最佳做法?
答案 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。