You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring MVC 4.3未记录异常堆栈追踪,如何解决?

解决方案

一、让日志输出完整异常堆栈追踪

Spring的AbstractHandlerExceptionResolver默认仅打印异常消息,不会输出堆栈信息。我们可以通过继承SimpleMappingExceptionResolver自定义异常解析器,重写日志打印逻辑来解决:

  1. 实现自定义异常解析器
public class CustomMappingExceptionResolver extends SimpleMappingExceptionResolver {

    @Override
    protected void logException(Exception ex, HttpServletRequest request) {
        if (getWarnLogger() != null && getWarnLogger().isWarnEnabled()) {
            // 传入异常对象作为日志方法的第二个参数,触发日志框架输出堆栈
            getWarnLogger().warn(buildLogMessage(ex, request), ex);
        }
    }
}
  1. 修改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修改属性名),你可以在错误视图中直接获取并打印:

  1. 在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>
  1. (可选)自定义request中的异常属性名
    若不想使用默认的exception属性名,可在配置中指定:
<property name="exceptionAttribute" value="errorException"/>

之后在视图中通过${errorException}获取异常对象即可。

注意事项

  • 生产环境请务必关闭前端的堆栈显示,避免泄露系统内部细节,仅保留日志中的堆栈记录用于排查问题。
  • 确保日志框架配置正确,比如设置合适的日志级别和输出格式,保证堆栈信息能正常写入日志文件。

内容的提问来源于stack exchange,提问作者jpprade

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 02:57:54