@WebFilter和FacesContext.getCurrentInstance() - >空指针

时间:2013-08-16 09:28:17

标签: jsf servlet-filters

在我的应用程序中,我有一个WebFilter。这个Webfilter应该检查一个coockie。但是使用FacesContext.getCurrentInstance()会产生Nullpointer异常。我该如何解决这个问题?

WebFilter:

@Inject
private CookieManager cm;   

[...]

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    if(cm.isDoCheck()){
        cm.doCheck();
    }
    chain.doFilter(request, response);
}
[...]

执行FacesContext.getCurrentInstance()的CookieManager:

[...]
private void doCheck(){
    FacesContext context = FacesContext.getCurrentInstance();
    Map<String, Object> cookies = context.getExternalContext().getRequestCookieMap();

    Cookie cookie = (Cookie) cookies.get("frontend");
    if(cookie != null){
        setSessionHash(cookie.getValue());
    }
}
[...]

context.getExternalContext().getRequestCookieMap();给出了

StandardWrapperValve[Faces Servlet]: Servlet.service() for servlet Faces Servlet threw exception
java.lang.NullPointerException

1 个答案:

答案 0 :(得分:4)

FacesContextFacesServlet创建。在任何servlet之前调用的任何servlet过滤器。因此,FacesContext根据定义在任何servlet过滤器中都不可用。

至于抓取请求cookie的具体功能要求,您似乎完全错过了FacesContext ServletRequest ServletResponse ExternalContext和{{1}的事实。 }}。 ServletRequest所有方法的所有方法均由ServletResponse / ServletRequest方法覆盖(这在facade明确提到,例如javadoc)。您需要的Cookie方法可以通过doFilter()方法的HttpServletRequest hsr = (HttpServletRequest) request; Cookie[] cookies = hsr.getCookies(); // Loop over cookies to find the one matching the name. 参数随时使用。

FacesContext

注意应该是getRequestCookieMap()可以根据ServletRequestServletResponse变量自行在过滤器中创建FacesServlet,但这毕竟没有任何意义如果这些变量本身可以随时获得这些信息。

我建议暂停一点JSF并学习基本的Servlet API。这基本上是JSF在幕后使用的(你看,它的ExternalContext“只是”一个servlet)。阅读{{1}} javadoc中的方法描述也应该提示您在所有这些方法从其获取信息的基本Servlet API中的确切位置。