Struts2与AJAX交互异常:JSON解析错误及响应进入错误函数问题
Struts2 AJAX请求返回JSON解析错误、进入错误函数的解决方案
以下是针对该问题的常见排查方向和解决方法:
1. 确认Struts2 JSON插件已正确引入
Struts2本身不默认支持JSON响应,必须依赖struts2-json-plugin组件:
- Maven项目需在
pom.xml中添加依赖:<dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-json-plugin</artifactId> <version>对应你的Struts2版本</version> </dependency> - 非Maven项目需将对应版本的
struts2-json-plugin.jar放入WEB-INF/lib目录。
2. 配置Action的Result类型为JSON
在struts.xml中,确保目标Action的返回结果类型为json,且避免多余的视图输出:
<action name="propertyTesting" class="com.yourpackage.PropertyTesting"> <result type="json"> <!-- 可选:指定序列化的根对象,减少冗余数据 --> <param name="root">responseData</param> </result> </action>
3. 确保响应为纯JSON格式
任何非JSON内容(如HTML标签、空格、换行、错误日志)都会导致解析失败:
- 检查对应的JSP页面,删除所有多余的HTML代码、注释或空白行(即使是JSP开头的空行也可能输出到响应流);
- 禁止在Action中通过
ServletActionContext.getResponse().getWriter()输出额外内容,也不要将System.out的输出混入响应流。
4. 修正AJAX请求的参数配置
确保AJAX请求明确指定期望JSON响应,并配置正确的内容类型:
$.ajax({ url: "propertyTesting.action", type: "POST", dataType: "json", // 关键:告知客户端期望JSON格式 contentType: "application/x-www-form-urlencoded; charset=utf-8", // 表单提交场景 data: { paramName: "paramValue" }, success: function(res) { console.log("成功响应:", res); }, error: function(xhr) { // 临时打印响应内容,快速定位问题 console.log("实际返回内容:", xhr.responseText); } });
5. 检查Action类的序列化规则
JSON插件通过Getter方法序列化属性,需满足以下要求:
- 要返回的属性必须提供对应的Getter方法;
- 无需序列化的属性可通过
@JSON(serialize=false)注解排除,避免序列化错误; - 示例Action代码:
public class PropertyTesting extends ActionSupport { private String resultMsg; // 必须提供Getter方法 public String getResultMsg() { return resultMsg; } public void setResultMsg(String resultMsg) { this.resultMsg = resultMsg; } public String execute() { resultMsg = "请求处理成功"; return SUCCESS; } }
6. 统一响应编码
避免因编码问题导致JSON解析失败,在struts.xml中配置全局编码:
<constant name="struts.i18n.encoding" value="UTF-8"/> <constant name="struts.json.encoding" value="UTF-8"/>
快速定位技巧
先在AJAX的error函数中打印xhr.responseText,查看实际返回的内容:
- 如果返回的是Struts2错误页面,说明Action配置或路径有误;
- 如果返回的是带HTML前缀的JSON,说明存在多余的视图输出;
- 如果返回的是空白或乱码,优先排查编码问题。
内容的提问来源于stack exchange,提问作者s.surya Prakash
相关产品推荐
相关产品推荐

