如何从HttpSessionListener访问JSF应用程序范围的托管bean?

时间:2012-11-29 10:15:23

标签: jsf

我正在运行 JSF 应用程序并声明了一些应用程序范围的后备bean(在 common-beans.xml 中或使用@ManagedBean和{ {1}}注释)。

如何从@ApplicationScoped

中访问这些bean

我知道javax.servlet.http.HttpSessionListener在会话侦听器中不可用,因此使用:

FacesContext

......按预期投入NPE。

更新:

(在BalusC回答之前)

我最终做的是使用 env-entry 元素声明我需要在 web.xml 中访问的应用程序范围的信息(而不是使用应用程序范围的bean )然后使用以下方法检索该信息:

public class AnHTTPSessionListener implements HttpSessionListener {
    ...
    public void sessionDestroyed(HttpSessionEvent e) {
        AppBean appBean = (AppBean) FacesContext.getCurrentInstance()
                                                .getExternalContext()
                                                .getApplicationMap().get("appBean")
       ...
    }

这不是我想到的,但它是一种解决方法。

1 个答案:

答案 0 :(得分:9)

JSF将应用程序范围的托管bean存储为ServletContext的属性。

所以,这应该做:

public void sessionDestroyed(HttpSessionEvent e) {
    AppBean appBean = (AppBean) e.getSession().getServletContext().getAttribute("appBean");
    // ...
}

另见: