Java Spring框架中的NullPointerException(或者什么?)

Java Spring框架中的NullPointerException(或者什么?),java,spring,exception,servlets,servlet-filters,Java,Spring,Exception,Servlets,Servlet Filters,我遇到了一个非常奇怪的问题,我根本不知道从哪里开始。在我们的工作应用程序中,我们的一个页面似乎有点随意失败——也就是说,它有时工作,有时不工作 web应用程序正在运行Java6、Spring2.5.6和Hibernate3.2.6。此外,我们正在使用Javax.servlet版本3.0(可能相关) 问题变得很难解决,因为stacktrace非常有限,似乎不涉及任何自定义代码(我们所有的类都以com.isworld.*开头)。 该错误发生在加载页面后,即提交表单并处理请求时。见下文: org.sp

我遇到了一个非常奇怪的问题,我根本不知道从哪里开始。在我们的工作应用程序中,我们的一个页面似乎有点随意失败——也就是说,它有时工作,有时不工作

web应用程序正在运行Java6、Spring2.5.6和Hibernate3.2.6。此外,我们正在使用Javax.servlet版本3.0(可能相关)

问题变得很难解决,因为stacktrace非常有限,似乎不涉及任何自定义代码(我们所有的类都以com.isworld.*开头)。
该错误发生在加载页面后,即提交表单并处理请求时。见下文:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.NullPointerException
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:583)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:511)
javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:265)
org.acegisecurity.intercept.web.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:107)
org.acegisecurity.intercept.web.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:72)
org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
org.acegisecurity.ui.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:124)
org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
org.acegisecurity.providers.anonymous.AnonymousProcessingFilter.doFilter(AnonymousProcessingFilter.java:125)
org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
org.acegisecurity.wrapper.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:81)
org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
org.acegisecurity.ui.rememberme.RememberMeProcessingFilter.doFilter(RememberMeProcessingFilter.java:142)
org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
org.acegisecurity.ui.AbstractProcessingFilter.doFilter(AbstractProcessingFilter.java:271)
org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
org.acegisecurity.ui.logout.LogoutFilter.doFilter(LogoutFilter.java:110)
org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
org.acegisecurity.context.HttpSessionContextIntegrationFilter.doFilter(HttpSessionContextIntegrationFilter.java:249)
org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
org.acegisecurity.util.FilterChainProxy.doFilter(FilterChainProxy.java:149)
org.acegisecurity.util.FilterToBeanProxy.doFilter(FilterToBeanProxy.java:98)
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:96)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)

root cause

java.lang.NullPointerException
这就是stacktrace的全部内容


我不指望你们中的任何人能想出解决这个问题的办法,但希望你们能给我指出一些方向——我没有更多的想法

因此,在servlet的执行过程中发生了一个NullPointerException,Spring框架捕获了这个异常,它似乎不需要显示它

您需要知道NullPointerException发生在哪里

以下是两种可能的进一步调查方法:

  • 在Spring源代码中更改FrameworkServlet.java,以便显示导致异常的堆栈跟踪
  • 用try/catch包装servlet以捕获所有异常,如:

    试一试{ …您的servlet代码。。。 }捕获(运行时异常e){ e、 printStackTrace(); }


    • Spring框架是开源的,对吗?那么让我们看看
      FrameworkServlet
      的583行有什么内容

      我们可以发现以下几点:

      try {
          doService(request, response);
      //omit a few catches...
      } catch (Throwable ex) {
          failureCause = ex;
      throw new NestedServletException("Request processing failed", ex); //line 583
      }
      
      因此,异常来自
      FrameworkServlet.doService
      方法,它由Spring框架正确处理。让我们来看看麻烦的
      doService
      方法

      FrameworkServlet.doService
      是抽象的,但在项目中最可能使用的
      DispatcherServlet
      中实现。此外,它调用“doDispatch”,将请求的处理分派给控制器


      我的直觉告诉我,我们一直在这里寻找的讨厌的NPE隐藏在你的控制器代码中…

      在IDE中设置一个断点,使其在抛出NullPointerException时停止(必要时连接远程调试器)

      我和@Hoof有同样的症状。但在我的情况下,它是在我的开发笔记本电脑。在重新启动tomcat根原因之后,现在又可以看到Stacktrace了

      你能不能也贴出根本原因的痕迹?这将有助于了解那里发生了什么。这就是全部。。。正如Jerome所建议的,我正在尝试包装它,并获得完整的堆栈跟踪…您使用的是哪个版本的Spring?好的,我知道那个版本。这是2.5.x.@Hoof:你会发布你的控制器代码吗?我想这是个问题。我真的怀疑这是弹簧故障。正如您在我的回答
      FrameworkServlet
      中所看到的,通过将异常重新抛出给调用方,可以很好地处理异常,因此在我看来,添加另一个try/catch块并不是一个好主意。我可以理解为什么人们会这样认为,但是问题只发生在我们的生产环境中。在本地数据存储和本地webapp上运行的复制环境运行良好。。。但我会看看是否有什么异常…是的,看看你的代码。这可能是一个数据问题。我不知道如何访问数据库,但可能是一些空列或JPA/Hibernate实体的问题。但是这个错误应该是持久的,而不是像现在这样随机的。使用相同的数据和代码,错误只发生在一台服务器上。不在测试中,也不在本地。基本上,用户可以从列表中选择要在页面中显示的项目。通过提交页面,视图将用onFormChange方法更新,实际上没有什么神奇的事情发生。。。我将进一步调查…:/我所能做的就是祈求好运,因为没有水晶球,根据你提供的证据,我说不出太多;)我认为这是不言而喻的下一步,但显然其他人不这么认为。。。