【问题标题】:Need help understanding an exception in Tomcat servlet需要帮助了解 Tomcat servlet 中的异常
【发布时间】:2013-05-20 19:57:25
【问题描述】:

我有以下异常:

Servlet.service() for servlet indexpage threw exception java.lang.NullPointerException
at org.apache.catalina.servlets.DefaultServlet.serveResource(DefaultServlet.java:675)
at org.apache.catalina.servlets.DefaultServlet.doHead(DefaultServlet.java:351)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at planplatform.cors.CorsFilter.doFilter(CorsFilter.java:61)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190)
at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:291)
at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:769)
at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:698)
at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:891)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690)
at java.lang.Thread.run(Unknown Source)

这个异常中唯一属于我的代码是 CorsFilter:

HttpServletRequest req = (HttpServletRequest) servletRequest;
    HttpServletResponse resp = (HttpServletResponse) servletResponse;

    String origin = req.getHeader("Origin");

    boolean shouldAllowCorsOnOrigin = allowCorsOnOrigin(origin);

    if (shouldAllowCorsOnOrigin) 
    {
        resp.addHeader("Access-Control-Allow-Origin", origin);
        resp.addHeader("Access-Control-Allow-Credentials", "true");

        resp.setHeader("Allow", "GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS");

        String headers = req.getHeader("Access-Control-Request-Headers");
        String method = req.getHeader("Access-Control-Request-Method");
        resp.addHeader("Access-Control-Allow-Methods", method);
        resp.addHeader("Access-Control-Allow-Headers", headers);

        if ("options".equalsIgnoreCase(req.getMethod())) 
        {
            resp.setContentType("text/plain");

            resp.getWriter().flush();
            return;
        }
    }

    // Fix ios6 caching post requests
    if ("post".equalsIgnoreCase(req.getMethod())) {
        resp.addHeader("Cache-Control", "no-cache");
    }

    if (filterChain != null) {
        filterChain.doFilter(req, resp);
    }

shouldAllowCorsOnOrigin 为 false,所以代码不进入大 if。

知道为什么会发生异常吗?

【问题讨论】:

  • CorstFilter 的第 61 行是什么?
  • filterChain.doFilter(req, resp);
  • 异常不会在本地发生,只会在生产服务器上发生,我无法在调试模式下重现它。
  • CorsFilter 位于堆栈跟踪中,因为请求通过过滤器链,但它并不来自那里。你的indexpage servlet 是什么样的?
  • 代码没有到达 indexpage servlet。

标签: java tomcat servlets servlet-filters


【解决方案1】:

我会得到 Tomcat 的版本号并查找该版本的 DefaultServlet 的源代码。我查了 6.0.26,但堆栈跟踪中的行号与可能引发此错误的行不一致。

DefaultServlet 中引发错误的方法取决于从其自身上下文或 JNDI 查找中获得的资源。在日志中进一步查看以“无资源”作为消息的异常。 DefaultServlet.init() 方法使用两个常量来查找资源——服务器环境是否具有其中之一的资源?

【讨论】:

  • 是的,这也是我尝试过的 - 行号没有任何意义
  • 好吧,如果您需要帮助,您将不得不提供更多信息。服务器用的是什么版本,怎么知道的,让别人看?
  • 是的,诊断这个需要tomcat的确切版本
【解决方案2】:

您应该查看 indexpage servlet,可能有问题,因为在您的堆栈跟踪中,Servlet.service() 期间有空指针,并且该方法由 servlet 容器调用以允许 servlet 响应请求。在执行 init 方法之前(在索引页)。你能给我们看看 indexpage servlet 吗?

【讨论】:

  • 如果问题出在 indexpage servlet 中,我不会在堆栈中看到它吗?似乎异常发生在调用 servlet 本身之前,不是吗? servlet 相当复杂,不幸的是我不能分享它的代码
猜你喜欢
  • 1970-01-01
  • 2018-10-01
  • 2017-06-19
  • 2016-05-03
  • 1970-01-01
  • 2021-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多