Java FacesContext中getExternalContext中的NullpointerException

Java FacesContext中getExternalContext中的NullpointerException,java,jsf,Java,Jsf,我尝试从FacesContext获取外部上下文,如下所示,并获得NullPointerException: ExternalContext context = FacesContext.getCurrentInstance().getExternalContext(); 什么可能导致问题 只有在返回null时才会导致该错误。任何访问或调用null引用的尝试都将导致NullPointerException。另见: 当应用程序试图在需要对象的情况下使用null时引发。这些措施包括: 调用null

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

ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
什么可能导致问题

只有在返回
null
时才会导致该错误。任何访问或调用
null
引用的尝试都将导致
NullPointerException
。另见:

当应用程序试图在需要对象的情况下使用
null
时引发。这些措施包括:

  • 调用
    null
    对象的实例方法
  • 访问或修改
    null
    对象的字段
  • null
    的长度视为数组
  • 像数组一样访问或修改
    null
    的插槽
  • null
    作为一个
    Throwable
    值抛出
应用程序应该抛出此类的实例,以指示
null
对象的其他非法使用

FacesContext#getCurrentInstance()
返回
null
只能在该行代码未在JSF上下文中执行的情况下,即在
FacesServlet
提供服务的HTTP请求期间运行的代码时,才可能导致返回
null
,谁负责将
FacesContext
创建为
ThreadLocal
。例如,在普通servlet、servlet过滤器或servlet侦听器中,或者在运行
FacesServlet
的HTTP请求期间未执行的任何其他代码

如何正确地解决这一问题取决于问题中未明确的功能需求。通常,您要么确保HTTP请求通过
FacesServlet
,要么通过更适合代码当前运行的上下文的其他方式访问您正在查找的信息。

只有在返回
null
时才会导致此问题。任何访问或调用
null
引用的尝试都将导致
NullPointerException
。另见:

当应用程序试图在需要对象的情况下使用
null
时引发。这些措施包括:

  • 调用
    null
    对象的实例方法
  • 访问或修改
    null
    对象的字段
  • null
    的长度视为数组
  • 像数组一样访问或修改
    null
    的插槽
  • null
    作为一个
    Throwable
    值抛出
应用程序应该抛出此类的实例,以指示
null
对象的其他非法使用

FacesContext#getCurrentInstance()
返回
null
只能在该行代码未在JSF上下文中执行的情况下,即在
FacesServlet
提供服务的HTTP请求期间运行的代码时,才可能导致返回
null
,谁负责将
FacesContext
创建为
ThreadLocal
。例如,在普通servlet、servlet过滤器或servlet侦听器中,或者在运行
FacesServlet
的HTTP请求期间未执行的任何其他代码


如何正确地解决这一问题取决于问题中未明确的功能需求。通常,您要么确保HTTP请求通过
FacesServlet
,要么通过更适合代码当前运行环境的其他方式访问您正在查找的信息。

非常感谢您提供的高度详细的帐户:)。由于这是我实现的所有代码行(与jsf相关),我想我需要启动HTTP请求。你能给我推荐一种最简单的方法吗?正如前面所说,这实际上取决于这行代码运行的上下文和功能需求。那行代码到底在哪里运行?您认为
ExternalContext
适合做什么?
ExternalContext
只是围绕
ServletContext
HttpServletRequest
HttpSession
HttpServletResponse
的一个门面。如果其中任何一个在代码运行的上下文中可用,只需直接使用其中一个即可。请随意提出一个新问题,详细描述功能需求。基本上,我需要能够使用ExternalContext#redirect将用户从我的屏幕转移到不同屏幕中的另一个工具。同样,代码当前运行的上下文是什么?例如,它是否在servlet过滤器的
doFilter()方法中?如果是,请将提供的
ServletResponse
参数强制转换为
HttpServletResponse
,并使用其
sendRedirect()方法。如果您真的坚持使用JSF ish方式进行检查或回答,非常感谢您提供的高度详细的说明:)。由于这是我实现的所有代码行(与jsf相关),我想我需要启动HTTP请求。你能给我推荐一种最简单的方法吗?正如前面所说,这实际上取决于这行代码运行的上下文和功能需求。那行代码到底在哪里运行?您认为
ExternalContext
适合做什么?
ExternalContext
只是围绕
ServletContext
HttpServletRequest
HttpSession
HttpServletResponse
的一个门面。如果其中任何一个在代码运行的上下文中可用,只需直接使用其中一个即可。请随意提出一个新的问题,其中您描述了功能