gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 21:26:38 24 4
gpt4 key购买 nike

我正在运行一个JSF应用程序,并声明了一些应用程序范围的支持bean(在common-beans.xml中或使用@ManagedBean@ApplicationScoped)注释)。

如何从javax.servlet.http.HttpSessionListener内部访问这些bean ?

据我了解,FacesContext在 session 监听器中不可用,因此使用:

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

...按预期抛出了 NPE。

更新:

(BalusC 回答之前)

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

   InitialContext ic = new InitialContext();
Context env = (Context) ic.lookup("java:comp/env");
appName = (String) env.lookup("appBeanValue");

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

最佳答案

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

所以,应该这样做:

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

另请参阅:

关于jsf - 如何从 HttpSessionListener 访问 JSF 应用程序范围的托管 bean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13623443/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com