一尘不染

为什么jsp:include(有时)会在Google App Engine上引起StackOverflowErrors?

jsp

StackOverflowErrors在GAE上遇到对应用程序最新版本的所有请求。我跟踪了问题#3588,但由于记者将其归咎于第三方库,并且Google工程师不想再查找了,因此已关闭。在我的情况下,没有第三方库要怪。我只是在页面模板中做一些非常基本的jsp:includes。

记录的错误开始如下:

java.lang.StackOverflowError
at java.util.HashMap.removeEntryForKey(HashMap.java:565)
at java.util.HashMap.remove(HashMap.java:555)
at org.mortbay.util.AttributesMap.removeAttribute(AttributesMap.java:51)
at org.mortbay.jetty.servlet.Dispatcher$ForwardAttributes.setAttribute(Dispatcher.java:441)
at org.mortbay.jetty.servlet.Dispatcher$ForwardAttributes.removeAttribute(Dispatcher.java:461)
at org.mortbay.jetty.servlet.Dispatcher$IncludeAttributes.setAttribute(Dispatcher.java:549)
at org.mortbay.jetty.servlet.Dispatcher$IncludeAttributes.removeAttribute(Dispatcher.java:569)
at org.mortbay.jetty.servlet.Dispatcher$IncludeAttributes.setAttribute(Dispatcher.java:549)
at org.mortbay.jetty.servlet.Dispatcher$IncludeAttributes.removeAttribute(Dispatcher.java:569)
at org.mortbay.jetty.servlet.Dispatcher$IncludeAttributes.setAttribute(Dispatcher.java:549)
at org.mortbay.jetty.servlet.Dispatcher$IncludeAttributes.removeAttribute(Dispatcher.java:569)

Get / setAttribute调用重复一段时间,然后…

at org.mortbay.jetty.servlet.Dispatcher.include(Dispatcher.java:145)
at com.google.apphosting.runtime.jetty.ResourceFileServlet.serveWelcomeFileAsForward(ResourceFileServlet.java:340)
at com.google.apphosting.runtime.jetty.ResourceFileServlet.maybeServeWelcomeFile(ResourceFileServlet.java:281)
at com.google.apphosting.runtime.jetty.ResourceFileServlet.doGet(ResourceFileServlet.java:142)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:390)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
at org.mortbay.jetty.servlet.Dispatcher.include(Dispatcher.java:192)
at

并且该块也重复。

问题3588的记者和我都认为这与jsp:include有关。我的应用程序的先前版本可以使用并使用jsp:include,但该较新版本也使用jsp:param和某些EL语法。这些可能与问题有关,也可能与问题无关。这一切都在开发中。该问题仅在部署到GAE后才显现出来,此时所有页面请求均导致500个服务器错误,并且日志显示此StackOverflowError。没有记录的堆栈跟踪在任何地方提及我的任何代码。

堆栈跟踪还提到了也许ServeWelcomeFile和serveWelcomeFileAsForward。最新版本的web.xml中的欢迎文件定义没有任何变化。

Google搜索显示了上面链接的问题,但仅此而已。我的下一步将尝试找出导致此问题的确切变化,但是其他人可以提供的任何见解将非常有帮助。


阅读 260

收藏
2020-06-08

共1个答案

一尘不染

此错误是由jsp:引起的,包括服务器上不存在的文件。参见问题#5564。当我部署到Google
App Engine时,开发环境中存在的某些文件不会以某种方式上传( 更新:
另请参见问题#5565)。

2020-06-08