chain.doFilter(request,respone) 报空指针

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了chain.doFilter(request,respone) 报空指针相关的知识,希望对你有一定的参考价值。

启动无问题了,但进行页面时跳转重定向报错:
[WARN] 2014-07-26 16:17:37,790 com.sun.faces.application.ViewHandlerImpl - Unable to determine FaceServlet mapping for servlet path '/login.jsf'.
[ERROR] 2014-07-26 16:17:37,801 org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/crams].[Faces Servlet] - Servlet.service() for servlet Faces Servlet threw exception
java.lang.NullPointerException
at org.ajax4jsf.framework.ajax.AjaxViewHandler.createView(AjaxViewHandler.java:78)
at org.apache.myfaces.lifecycle.LifecycleImpl.restoreView(LifecycleImpl.java:127)
at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:66)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:197)
at org.apache.myfaces.webapp.MyFacesServlet.service(MyFacesServlet.java:74)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.ajax4jsf.framework.ajax.xmlfilter.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:96)
at org.ajax4jsf.framework.ajax.xmlfilter.BaseFilter.doFilter(BaseFilter.java:220)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at cn.ccb.system.admin.util.context.MenuUrlFilter.doFilter(MenuUrlFilter.java:102)
..........

大神们能否帮一下解决?

参考技术A 报错的是at javax.faces.webapp.FacesServlet.service(FacesServlet.java:197) 这行,不是filter。debug下看这行什么东西为空追问

工程中没有这个类,这个封装类里的报错。

参考技术B 一个你的哪里的定义没有给个null追问

不是没有给null,而是没有编译对象出来,引用的时候自然是空。问题是这种异常的特殊情况有哪些。

chain.doFilter 在 Filter.doFilter 方法中做了啥?

【中文标题】chain.doFilter 在 Filter.doFilter 方法中做了啥?【英文标题】:What is chain.doFilter doing in Filter.doFilter method?chain.doFilter 在 Filter.doFilter 方法中做了什么? 【发布时间】:2011-01-04 16:23:24 【问题描述】:

Filter.doFilter 方法中,我调用了chain.doFilter

doFilterdoFilter 中做什么?不是递归调用吗?

【问题讨论】:

java.sun.com/products/servlet/Filters.html 【参考方案1】:

Servlet 过滤器是 Chain of responsibility 设计模式的实现。

所有过滤器都是链接的(按照它们在 web.xml 中的定义顺序)。 chain.doFilter() 正在处理链中的下一个元素。链的最后一个元素是目标资源/servlet。

【讨论】:

嗨@Bozho,我可以在doFilter方法中添加另一个filter.doFilter()吗?【参考方案2】:

它调用的是chain对象的doFilter方法,而不是它本身,所以不,它不会是递归的。

chain 这个名字表明你有一个过滤器序列,每个过滤器做一些处理,然后依次传递给下一个过滤器,所以每个对象都有一个chain 成员指向下一个过滤器序列,在过滤器执行完自己的处理后调用。序列中的最后一个可能会将null 作为chain 值,或者它自己知道它是序列中的最后一个。

【讨论】:

【参考方案3】:

它在内部调用过滤器链中下一个过滤器的doFilter,当链结束时,它调用目标servlet。

【讨论】:

【参考方案4】:

没有你所说的任何代码,我只能假设你是这样的:

class Filter implements FilterAPI 
  private FilterAPI chain;
  FilterAPI(FilterAPI chain)  this.chain = chain; 
  @override void doFilter (Set setToFilter) 
    // do some filtering on setToFilter
    chain.doFilter(setToFilter);
  

如果是这种情况,那么您不会递归调用任何东西,而是在不同的对象上调用 doFilter()。正如另一个答案中提到的,这是众所周知的责任链设计模式。

【讨论】:

这似乎是c#,这篇文章被标记为java。然而,答案仍然是正确的。 我相信以上是有效的Java代码?我只是修复了构造函数的名称…… 可能是,我很困惑,因为我从未在 java.servlet.Filter 中见过 filterAPI 接口。或许这只是我自己的无知。 FilterAPI 来自哪里? FilterAPI 只是一个虚构的名字……Filter 的 API ;-)【参考方案5】:

通过调用chain.doFilter,您将请求/响应交给过滤器链中的下一个过滤器。如果您不调用它,则不会执行下一个过滤器(可能在您的 web.xml 中定义)。

如果您只是调用 doFilter,那么是的,您将拥有无限递归和堆栈溢出。但是,您正在调用 filterChain 对象的 doFilter 方法,该方法指示它执行下一个过滤器。

【讨论】:

【参考方案6】:

导致调用链中的下一个过滤器,或者如果调用过滤器是链中的最后一个过滤器,则导致调用链末尾的资源。

【讨论】:

【参考方案7】:

是的,准确地说是递归调用。如果您将过滤器设置为这样的文件夹,

/javax.faces.resource/*

那么这个文件夹中的所有资源都会被递归调用。所以如果你想用你会写的资源做点什么

    @Override
  public void doFilter(ServletRequest request, ServletResponse response,
      FilterChain chain)
      throws IOException, ServletException 
    doSomething(request, response);
    chain.doFilter(request, response);
  

对chain.doFilter(...)的调用会处理当前的请求/响应,然后用下一个资源调用doFilter,直到url-pattern中的所有资源都被后续的doFilter()调用处理完。

假设你可以有一个 ImagesFilter 和一个 SessionFilter 实现。 对于这些过滤器实现,您将使用 URL 模式定义过滤器映射。

<filter-mapping>
    <filter-name>SessionFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

路径 /* 中的所有资源最终将被过滤器实现中的 doFilter(...) 方法调用,但最有趣的是,FilterChain 中的 doFilter 将执行请求/响应的实际处理。 因此,如果您不调用 chain.doFilter(...) 那么您的响应可能会被破坏。

【讨论】:

以上是关于chain.doFilter(request,respone) 报空指针的主要内容,如果未能解决你的问题,请参考以下文章

对chain.doFilter(request,response)的理解

chain.doFilter(req, resp)

Java filter中的chain.doFilter详解

java 过滤器Filter中chain.doFilter()之前和之后代码的执行顺序

为啥 Tuckey UrlRewrite Filter 在规则匹配后不调用chain.doFilter?

chain.dofilter(req,resp) 后 需要加return吗? 为啥?