Struts中JSON插件与全局异常:如何返回JSON格式全局异常?
Struts2全局异常返回JSON格式配置指南
我来帮你搞定Struts2全局异常返回JSON的配置问题!从你给出的部分struts.xml来看,你已经走对了第一步(继承了json-default包并定义了JSON拦截器),但还缺几个关键配置环节,具体如下:
1. 添加全局异常映射与对应JSON结果
要让所有异常统一返回JSON格式,必须在你的mkaStrive包中配置全局异常映射,指定异常类型和对应的JSON结果:
<package name="mkaStrive" extends="json-default"> <!-- 全局异常映射:匹配异常类型并指定结果 --> <global-exception-mappings> <!-- 捕获所有通用异常 --> <exception-mapping exception="java.lang.Exception" result="jsonGlobalException"/> <!-- 可以添加自定义异常的映射,更精准处理 --> <exception-mapping exception="com.yourproject.exception.BusinessException" result="jsonBusinessException"/> </global-exception-mappings> <!-- 配置全局JSON结果,定义返回的异常字段 --> <global-results> <result name="jsonGlobalException" type="json"> <!-- 配置要返回的异常属性,比如错误信息、堆栈片段 --> <param name="includeProperties">exception\.message, exception\.stackTrace\[\d+\]\.className</param> <!-- 如果需要隐藏敏感信息,也可以用excludeProperties排除冗余字段 --> <!-- <param name="excludeProperties">exception\.stackTrace.*</param> --> </result> <result name="jsonBusinessException" type="json"> <!-- 自定义异常可以返回业务错误码、自定义提示 --> <param name="includeProperties">errorCode, errorMsg</param> </result> </global-results> <!-- 你的现有拦截器配置 --> <interceptors> <interceptor name="json" class="org.apache.struts2.json.JSONInterceptor" /> <!-- 关键:把JSON拦截器加入默认拦截器栈,确保所有Action都能触发JSON序列化 --> <interceptor-stack name="customJsonStack"> <interceptor-ref name="defaultStack"/> <interceptor-ref name="json"/> </interceptor-stack> </interceptors> <!-- 设置默认拦截器栈为上面定义的自定义栈 --> <default-interceptor-ref name="customJsonStack"/> <!-- 你的Action配置示例 --> <action name="testAction" class="com.yourproject.action.TestAction"> <result type="json"/> </action> </package>
2. 确保异常类可被JSON序列化
- 如果你用了自定义异常,必须给需要返回的字段添加公共getter方法(比如
getErrorCode()、getErrorMsg()),否则JSON拦截器无法读取这些属性。 - 对于Java原生
Exception,Struts2的JSON拦截器可以直接通过exception.message获取错误信息,无需额外配置。
3. 验证拦截器栈生效
你之前只定义了JSON拦截器,但没有把它加入拦截器栈并设置为默认。如果某个Action没有使用包含JSON拦截器的栈,异常返回时就不会触发JSON序列化,这是最容易遗漏的点!
4. 额外调试小贴士
- 你已经开启了
struts.devMode=true,这会在控制台输出详细错误信息,方便排查配置问题,但生产环境记得关闭。 - 如果返回的JSON有乱码,可以添加
<constant name="struts.i18n.encoding" value="UTF-8"/>确保编码统一。
内容的提问来源于stack exchange,提问作者Noman
相关产品推荐
相关产品推荐

