Spring MVC 4.3未记录异常堆栈追踪,如何解决?
解决方案
一、让日志输出完整异常堆栈追踪
Spring的AbstractHandlerExceptionResolver默认仅打印异常消息,不会输出堆栈信息。我们可以通过继承SimpleMappingExceptionResolver自定义异常解析器,重写日志打印逻辑来解决:
- 实现自定义异常解析器
public class CustomMappingExceptionResolver extends SimpleMappingExceptionResolver { @Override protected void logException(Exception ex, HttpServletRequest request) { if (getWarnLogger() != null && getWarnLogger().isWarnEnabled()) { // 传入异常对象作为日志方法的第二个参数,触发日志框架输出堆栈 getWarnLogger().warn(buildLogMessage(ex, request), ex); } } }
- 修改Spring配置,替换原解析器为自定义类
<bean id="simpleMappingExceptionResolver" class="com.yourpackage.CustomMappingExceptionResolver"> <property name="exceptionMappings"> <props> <prop key="java.lang.Exception">error</prop> </props> </property> <property name="warnLogCategory" value="myuncaughtException"/> </bean>
修改后,日志框架(如Logback/Log4j)会自动输出完整的异常堆栈追踪。
二、在HTML视图中显示堆栈追踪(按需控制)
SimpleMappingExceptionResolver默认会将异常对象存入request的exception属性中(可通过setExceptionAttribute修改属性名),你可以在错误视图中直接获取并打印:
- 在JSP错误视图中打印堆栈(示例)
<%@ page isErrorPage="true" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>Error</title> </head> <body> <h2>系统异常</h2> <p>错误信息:${exception.message}</p> <!-- 仅开发环境显示堆栈,生产环境注释或移除该块 --> <c:if test="${applicationScope.env == 'development'}"> <h3>堆栈信息:</h3> <pre> <% exception.printStackTrace(new java.io.PrintWriter(out)); %> </pre> </c:if> </body> </html>
- (可选)自定义request中的异常属性名
若不想使用默认的exception属性名,可在配置中指定:
<property name="exceptionAttribute" value="errorException"/>
之后在视图中通过${errorException}获取异常对象即可。
注意事项
- 生产环境请务必关闭前端的堆栈显示,避免泄露系统内部细节,仅保留日志中的堆栈记录用于排查问题。
- 确保日志框架配置正确,比如设置合适的日志级别和输出格式,保证堆栈信息能正常写入日志文件。
内容的提问来源于stack exchange,提问作者jpprade
相关产品推荐
相关产品推荐

