【问题标题】:NullpointerException in getExternalContext in FacesContextFacesContext 中的 getExternalContext 中的 NullpointerException
【发布时间】:2012-01-08 04:24:07
【问题描述】:

我尝试从 FacesContext 获取外部上下文,并得到 NullPointerException:

ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();

什么可能导致问题?

【问题讨论】:

    标签: java jsf


    【解决方案1】:

    只有在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 运行,要么通过更适合代码当前运行的上下文的替代方式访问您正在寻找的信息。

    【讨论】:

    • 非常感谢您提供的非常详细的帐户:)。由于这就是我实现的所有代码行(与 jsf 相关),我想我需要让 HTTP 请求运行起来。你能建议我最简单的方法吗?
    • 如前所述,这实际上取决于这行代码运行的上下文和功能要求。那行代码到底在哪里运行?您认为ExternalContext 适合的具体操作是什么? ExternalContext 只是 ServletContextHttpServletRequestHttpSessionHttpServletResponse 周围的一个外观。如果它们中的任何一个在您的代码运行的上下文中可用,则只需直接使用其中一个即可。随意提出一个新问题,您可以在其中详细描述功能要求。
    • 基本上,我需要能够使用 ExternalContext#redirect 将用户从我的屏幕转移到另一个屏幕中的另一个工具。
    • 再次,代码当前运行的上下文是什么?例如在 servlet 过滤器的 doFilter() 方法中吗?如果是这样,请将提供的 ServletResponse 参数转换为 HttpServletResponse 并使用其 sendRedirect() 方法。如果您真的坚持以 JSF 方式进行检查,请检查 thisthis 答案
    猜你喜欢
    • 1970-01-01
    • 2016-02-21
    • 2014-12-31
    • 1970-01-01
    • 2012-12-10
    • 1970-01-01
    • 2013-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多