如果服务或控制器中发生异常,则由spring的HandlerExceptionResolvers处理。但是,如果.jsp处理中存在异常(例如 - PropertyNotFoundException
,即使使用JSTL也会发生),则spring不会通过其异常处理机制传递此异常。此外,它不被视为错误500,因此不考虑<error-page>
配置
相反,异常传播到servlet容器。这很好,但我实际上无法得到我想要的行为:
我目前的设置:
isErrorPage=true
<%@ page errorPage="500.jsp" %>
会发生什么 - 在任何地方都没有记录异常。并且未显示错误页面。相反,请求的页面显示为半渲染。如果我增加缓冲区大小(足以到达有问题的代码段),则只显示错误页面。 (再次,没有记录)
那么,我如何实现我的目标呢?在不更改缓冲区大小的情况下,在错误页面中不使用<c:catch>
且不使用ex.printStackTrace()
)
答案 0 :(得分:2)
将此添加到web.xml:
<servlet>
<servlet-name>ErrorServlet</servlet-name>
<servlet-class>package.of.ErrorServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ErrorServlet</servlet-name>
<url-pattern>/WEB-INF/servlets/error</url-pattern>
</servlet-mapping>
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/WEB-INF/servlets/error</location>
</error-page>
在ErrorServlet实现doService
方法中,因为servlet容器将在那里转发任何当前操作(GET,POST等)。
添加此辅助方法
public static < T extends Throwable > T getExceptionFromRequest (
final Class< T > exception_class,
final HttpServletRequest request
)
{
final T ret_val =
exception_class.cast(
request.getAttribute( SERVLET_EXCEPTION_ATTR )
);
if ( ret_val != null )
{
return ret_val;
}
return
exception_class.cast(
request.getAttribute( JSP_EXCEPTION_ATTR )
);
}
这两个常数:
public final static String SERVLET_EXCEPTION_ATTR =
"javax.servlet.error.exception";
public final static String JSP_EXCEPTION_ATTR =
"javax.servlet.jsp.jspException";
这在Tomcat中一直在为我工作。
答案 1 :(得分:1)
您是否可以使用preHandle()
和postHandle()
为空的HandlerInterceptor
,但是在afterComplete()
中是否符合例外?
答案 2 :(得分:0)
似乎有两个问题:
isErrorPage
,这将遵循您当前的设计