我的春天MVC Web应用程序有它一个可折叠的堆栈跟踪元素(显然是一个开发/调试选项)一个错误页面。这用于正常工作,并从控制器(或有时来自JSP引擎)显示适当的堆栈跟踪。JSP错误页面产生一个JSP错误
Q:是否有可能有一个JSP是一个错误页面,或者它应该是静态的HTML?
Q:我在做什么错?
的一连串事件是由我的web.xml中定义的错误处理程序驱动的(我认为):
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/view/errors/internalError.jsp</location>
</error-page>
沿途某处(切换到Maven构建系统,升级的码头,和春季2.5 - > 3.0),我注意到这个错误页面停止了以前的工作方式。它renderes一个问题是相同的 - 异常堆栈轨迹显示是不从控制器抛出的异常,但是从错误页面本身!
javax.servlet.ServletException: javax.servlet.jsp.JspTagException:
500 /WEB-INF/jsp/admin/errors/internalError.jsp
at org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:862)
at org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:791)
at org.apache.jsp.WEB_002dINF.jsp.admin.defaultParent_jsp._jspService(defaultParent_jsp.java:225)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
什么似乎是这里发生的,是下面的事件链:
- 春季控制器点击未捕获的异常:
throw new RuntimeException("no bananas")
- 此异常由弹簧底座的MultiActionController(因为没有自定义抓错误处理程序是为此页面定义的)重新引发异常:仅在Spring的DispatcherServlet中才会被捕获。
- 然后DispatcherServlet查看一些东西(可能是我的web.xml),以发现异常类型的错误页面:
- Spring然后将此URL解析为视图(以及我的错误JSP)并尝试呈现它。
- 现在,这里出问题时默认父JSP(见下面),抛出一个异常JSP其被捕后,这一次,由码头的ServletHolder。这个异常现在被映射(通过web.xml)到错误的JSP页面。
- 在这里,您可能会认为这会导致无限循环。但是,第二次的事情就会很好地发生,并且会导致JSP错误。
JSP引擎似乎在呈现默认父JSP时就死了 - 它似乎遇到了问题:org.apache.taglibs.standard.tag.common.core.ImportSupport
。我看过一些网络帖子,人们说它必须处理来自WEB-INF目录的导入。
// disallow inappropriate response codes per JSTL spec
if (irw.getStatus() < 200 || irw.getStatus() > 299) {
throw new JspTagException(irw.getStatus() + " " + stripSession(targetUrl));
}
虽然它看起来像任何HTTP 500错误会打破它。但是,这不是什么错误页应该有什么?
哇,它惊人的你能够从我的帖子中得知它。这正是我正在做的。 – Justin 2011-03-02 00:43:28
这完全解决了它,所有页面的默认父项不必要地使用了。我仍然不明白为什么从错误页面的错误显示正确..因为,它也使用默认的父母。 –
Justin
2011-03-02 03:21:22
不客气。 – BalusC 2011-03-02 03:21:47