我正在运行 JSF 应用程序并声明了一些应用程序范围的后备bean(在 common-beans.xml 中或使用@ManagedBean
和{ {1}}注释)。
如何从@ApplicationScoped
?
我知道javax.servlet.http.HttpSessionListener
在会话侦听器中不可用,因此使用:
FacesContext
......按预期投入NPE。
我最终做的是使用 env-entry 元素声明我需要在 web.xml 中访问的应用程序范围的信息(而不是使用应用程序范围的bean )然后使用以下方法检索该信息:
public class AnHTTPSessionListener implements HttpSessionListener {
...
public void sessionDestroyed(HttpSessionEvent e) {
AppBean appBean = (AppBean) FacesContext.getCurrentInstance()
.getExternalContext()
.getApplicationMap().get("appBean")
...
}
这不是我想到的,但它是一种解决方法。
答案 0 :(得分:9)
JSF将应用程序范围的托管bean存储为ServletContext
的属性。
所以,这应该做:
public void sessionDestroyed(HttpSessionEvent e) {
AppBean appBean = (AppBean) e.getSession().getServletContext().getAttribute("appBean");
// ...
}