【问题标题】:How does @SessionScoped work with EJB? Is CDI only for web-tier?@SessionScoped 如何与 EJB 一起工作? CDI 是否仅适用于 Web 层?
【发布时间】:2011-11-22 22:00:19
【问题描述】:

@SessionScoped CDI bean 中的 session 是如何定义的?
此注释是否仅在从 Servlet 容器调用时才有效,其中会话以 HttpSession 的形式明确定义?

如果不是,那么具有@Inject @SessionScoped MyBean myBean 的 EJB 如何知道会话到底是什么?我的意思是,这个 EJB 的方法可以由独立客户端、RESTful WS 或其他视图调用。
在这种情况下应该怎么办?如果注释没有意义,它应该为每个请求注入新的MyBean 实例,还是应该在所有请求中保留相同的实例?

【问题讨论】:

    标签: session servlets java-ee-6 cdi ejb-3.1


    【解决方案1】:

    取自@SessionScoped specification

    会话范围处于活动状态:

    在 Web 应用程序中任何 servlet 的 service() 方法期间, 在任何 servlet 过滤器的 doFilter() 方法期间以及当 容器调用任何 HttpSessionListener、AsyncListener 或 ServletRequestListener。

    总之,是的。它绑定到 HttpSession。另外:

    会话上下文在所有发生的 servlet 请求之间共享 在同一个 HTTP 会话中。会话上下文被销毁时 HTTPSession 超时,在所有 HttpSessionListeners 已经被 被调用,并且在 invalidate() 被调用的任何请求的最后 在所有过滤器和 ServletRequestListeners 被调用之后 调用。

    【讨论】:

    • 真的,即使是像 SFSB 这样的东西,Session 是如何定义的呢?当然,没有什么能阻止您创建自己的范围并将其与您喜欢的任何东西联系起来。
    • @LightGuard,我猜在 SFSB 中,“会话”从 SFSB 实例化持续到它被移除(或超时)。所以只要我有引用它,我就会打同一个环境(会话)。
    • @Gonzalo,感谢您提供此信息。我想知道 - 如果我在没有这样的范围的环境中使用 @SessionScoped bean 会发生什么(即问题中提到的 REST WS)。每个请求都被视为一个新会话?正如 LightGuard 提到的,SFSB 怎么样。 @SessionScoped 是指 HttpSession 会话还是 SFSB 会话?
    • 我的理解是@SessionScoped 充当Web 层和EJB 之间的粘合剂。我怀疑注释会对从 Swing 客户端调用的远程 EJB 产生任何影响。还要记住,JSF 会话也由 HttpSession 支持,因此它会作为 HttpSession 传输到您的 EJB。
    • 谢谢,我会尝试检查注解对 REST 调用的反应。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-30
    • 1970-01-01
    • 2013-06-30
    • 2011-11-18
    • 1970-01-01
    • 2015-01-29
    相关资源
    最近更新 更多