我遇到了一个非常奇怪的问题,我根本不知道从哪里开始。在我们的工作应用程序中,我们的一个页面似乎有点任意地失败 - 也就是说,有时它可以工作,有时却不能。
Web 应用程序运行 Java 6、Spring 2.5.6 和 Hibernate 3.2.6。此外,我们正在使用 Javax.servlet 版本 3.0(可能相关)。
问题变得很困难,因为堆栈跟踪非常有限,这似乎不涉及我们的任何自定义代码(我们所有的类都以 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
这就是堆栈跟踪的全部内容。
我不希望你们中的任何人想出解决这个问题的方法,但希望你们能给我指出一些方向 - 我没有更多的想法......
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。
因此,在servlet执行过程中发生了NullPointerException,并且这个异常被Spring框架捕获,而Spring框架似乎并没有费心去显示它。
您需要知道这个 NullPointerException 发生在哪里。
以下是进一步调查的两种可能方法:
用 try/catch 包装 servlet 以捕获所有异常,如下所示:
尝试{ ...您的servlet代码... } catch (RuntimeException e) { e.printStackTrace(); }
我说的是啊骗子,就是这样,听起来很有趣我很遗憾听到你的困境。锤子我说。我说我说用锤子打我的孩子。把它切成碎片,就像你讨厌那些老鼠一样,然后离开舞台。