我在生产系统上运行 Weblogic 8.1 SP6 服务器(JDK 1.4.2)。在服务器宕机之前,我们有时会在生产服务器上收到以下异常。我完全不知道如何解决这个问题。
java.lang.NullPointerException
at javax.servlet.GenericServlet.getServletContext(GenericServlet.java:205)
at com.sampleapp.arch.struts.InitializingRequestProcessor.getProcessorForModule(InitializingRequestProcessor.java:135)
at com.sampleapp.arch.struts.InitializingRequestProcessor.initializeFormBean(InitializingRequestProcessor.java:29)
at com.sampleapp.arch.struts.ResettingDynaValidatorForm.reset(ResettingDynaValidatorForm.java:46)
at org.apache.struts.taglib.html.FormTag.initFormBean(FormTag.java:484)
at org.apache.struts.taglib.html.FormTag.doStartTag(FormTag.java:457)
at org.apache.strutsel.taglib.html.ELFormTag.doStartTag(ELFormTag.java:267)
at jsp_servlet._util.__settingsdisplay_f._jspService(__settingsdisplay_f.java:355)
at weblogic.servlet.jsp.JspBase.service(JspBase.java:33)
InitializingRequestProcessor 的代码片段如下所示,并且在 return 语句中抛出 NullPointerException。
如果您需要任何其他信息,请询问。预先感谢。
private static RequestProcessor getProcessorForModule(ActionServlet servlet, ModuleConfig config) {
String key = Globals.REQUEST_PROCESSOR_KEY + config.getPrefix();
return (RequestProcessor) servlet.getServletContext().getAttribute(key);
}
更新
根据 Alex 的回复,事实证明 ResettingDynaValidatorForm(DynaValidatorForm 的自定义实现)正在从 struts 的 ActionForm 类获取超级 ActionServlet,该类返回 NULL 值。
是否有原因导致服务器在运行几天后才开始为 ActionServlet 返回 NULL 值?
这看起来很像 Struts 中的错误。此 NPE 是典型的
ServletConfig
不存在的情况,这意味着相关 servlet 没有正确覆盖 init(ServletConfig config)
方法。根据链接的 javadoc,实现者必须在其中显式调用 super.init(config)
。如果你不这样做,你就会得到这种 NPE。
尝试升级 Struts。
InitializingRequestProcessor 是你自己的类吗?
是否正在扩展RequestProcessor?您是否有可能重写一个方法(例如 init 之类的方法)而不在其中调用 super.init ?
据我所知,ActionServlet 似乎没有设置 ServletContext。如果您的类之一扩展了 Struts 框架的类之一,则可能会发生这种情况。确保在从 Struts Framework 重写的方法(例如 ActionServlet 或 RequestProcessor)中调用 super.methodName...
祝你好运,让我们知道进展如何