我试图从FacesContext获取外部上下文,并获得NullPointerException:
ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
什么可能导致问题?
答案 0 :(得分:10)
只有在FacesContext#getCurrentInstance()
返回null
时才会导致此错误。任何访问或调用null
引用的尝试都将导致NullPointerException
。另请参阅its javadoc:
当应用程序在需要对象的情况下尝试使用
null
时抛出。其中包括:
- 调用
null
对象的实例方法。- 访问或修改
null
对象的字段。- 将
null
的长度视为数组。- 访问或修改
null
的插槽,就好像它是一个阵列一样。- 将
null
投掷为Throwable
值。应用程序应抛出此类的实例以指示
null
对象的其他非法使用。
FacesContext#getCurrentInstance()
返回null
只会导致只有在JSF上下文中执行了 的代码行,即代码为时才会导致FacesServlet
返回FacesContext
不是在ThreadLocal
提供的HTTP请求期间运行,FacesServlet
负责将FacesServlet
创建为{{1}}。例如,在普通的servlet,servlet过滤器或servlet监听器中,或在运行{{1}}的HTTP请求期间未执行的任何其他代码。
如何正确解决问题取决于功能要求,问题尚不清楚。通常,您要么确保HTTP请求通过{{1}}运行,要么通过备用方式访问您正在查找的信息,这更适合代码当前运行的上下文。