【发布时间】:2012-01-08 04:24:07
【问题描述】:
我尝试从 FacesContext 获取外部上下文,并得到 NullPointerException:
ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
什么可能导致问题?
【问题讨论】:
我尝试从 FacesContext 获取外部上下文,并得到 NullPointerException:
ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
什么可能导致问题?
【问题讨论】:
只有在FacesContext#getCurrentInstance() 返回null 时才会出现这种情况。任何访问或调用null 引用的尝试都将导致NullPointerException。另见its javadoc:
当应用程序在需要对象的情况下尝试使用
null时引发。其中包括:
- 调用
null对象的实例方法。- 访问或修改
null对象的字段。- 将
null的长度视为一个数组。- 像数组一样访问或修改
null的槽。- 将
null视为Throwable值。应用程序应该抛出此类的实例,以指示
null对象的其他非法用途。
FacesContext#getCurrentInstance() 返回null 反过来只能在该行代码未在 JSF 上下文中执行时导致,即代码未 > 在由FacesServlet 提供服务的HTTP 请求期间运行,该FacesContext 负责将FacesContext 创建为ThreadLocal。例如,在普通 servlet、servlet 过滤器或 servlet 侦听器或任何其他在运行 FacesServlet 的 HTTP 请求期间未执行的代码。
如何正确解决它取决于问题中不清楚的功能要求。通常,您要么确保 HTTP 请求通过 FacesServlet 运行,要么通过更适合代码当前运行的上下文的替代方式访问您正在寻找的信息。
【讨论】:
ExternalContext 适合的具体操作是什么? ExternalContext 只是 ServletContext、HttpServletRequest、HttpSession 和 HttpServletResponse 周围的一个外观。如果它们中的任何一个在您的代码运行的上下文中可用,则只需直接使用其中一个即可。随意提出一个新问题,您可以在其中详细描述功能要求。