在我的应用程序中,我有一个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
答案 0 :(得分:4)
FacesContext
由FacesServlet
创建。在任何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()
可以根据ServletRequest
和ServletResponse
变量自行在过滤器中创建FacesServlet
,但这毕竟没有任何意义如果这些变量本身可以随时获得这些信息。
我建议暂停一点JSF并学习基本的Servlet API。这基本上是JSF在幕后使用的(你看,它的ExternalContext
“只是”一个servlet)。阅读{{1}} javadoc中的方法描述也应该提示您在所有这些方法从其获取信息的基本Servlet API中的确切位置。