Struts2 在類型轉換、驗證失效、文件上傳等場景下,若 Action 屬性綁定失敗(如 int 屬性接收 "ABC"),框架不會執行 execute(),直接返回 result name="input"。若未配置全局 input 結果,將拋出 404/500。本文提供統一錯誤處理方案:自定義 InputErrorAction 返回結構化 JSON,配合 redirectAction 實現優雅降級。
| 場景 | 默認行為 | 痛點 |
|---|---|---|
| 類型轉換失敗(String→int) | 返回 input 結果 | 無統一錯誤格式,前端難解析 |
| 驗證框架校驗不通過 | 返回 input 結果 | 需在每個 Action 配置 input 結果 |
| 文件上傳超過大小限制 | 返回 input 結果 | 用戶看到空白頁或報錯頁 |
1. 定義 InputErrorAction → 返回 JSON {Status: -1001, Desc: "輸入錯誤未通過驗證"}
2. Spring 註冊 Bean:inputErrorAction
3. struts.xml 定義 action name="input_error" class="inputErrorAction"
4. 所有業務 Action 添加 指向 input_error
package com.xkssh.action;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.ServletActionContext;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
@SuppressWarnings("serial")
public class InputErrorAction extends ActionSupport {
@Override
public String execute() {
Map result = new HashMap<>();
result.put("Status", -1001); // 自定義業務錯誤碼
result.put("Desc", "輸入錯誤未通過驗證");
try {
// 工具類輸出 JSON,設置 Content-Type: application/json;charset=UTF-8
ResUtil.toJson(ServletActionContext.getResponse(), result);
} catch (IOException e) {
e.printStackTrace();
}
return null; // 已手動輸出響應,不需視圖解析
}
}
<!-- 輸入錯誤處理 Action -->
<bean id="inputErrorAction" class="com.xkssh.action.InputErrorAction" />
<package name="default" extends="struts-default">
<!-- 統一錯誤處理 Action -->
<action name="input_error" class="inputErrorAction">
<!-- 無需 result,Action 內直接輸出 JSON -->
</action>
<!-- 業務 Action 示例:刪除購物車 -->
<action name="xkgwc_delete" class="xkgwcDeleteAction">
<result name="success" type="json"> <!-- 正常返回 JSON -->
<param name="root">resultMap</param>
</result>
<!-- 關鍵:輸入錯誤重定向到統一處理 -->
<result name="input" type="redirectAction">
<param name="actionName">input_error</param>
</result>
</action>
</package>
請求:POST /xkgwc_delete?id=ABC(id 為 int 類型)
響應:
HTTP/1.1 302 Found
Location: /input_error
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
{"Status":-1001,"Desc":"輸入錯誤未通過驗證"}

public class InputErrorAction extends ActionSupport {
@Override
public String execute() {
// 可從 ServletActionContext 獲取異常詳情(需配置 struts.devMode=true)
// 或通過 ThreadLocal/攔截器傳遞具體錯誤信息
Map result = new HashMap<>();
result.put("Status", -1001);
result.put("Desc", "輸入參數類型不匹配或驗證失敗");
ResUtil.toJson(ServletActionContext.getResponse(), result);
return null;
}
}
| 建議 | 說明 |
|---|---|
| 統一錯誤碼體系 | 如 -1001:輸入錯誤 -1002:權限不足 -1003:業務異常,前端統一處理 |
| 使用 redirectAction | 避免請求參數殘留,URL 乾淨,符合 PRG 模式 |
| Action 返回 null | 手動輸出響應後返回 null,跳過 Result 處理,性能更好 |
| 全局攔截器補充 | 可編寫自定義攔截器在 intercept() 統一捕獲轉換異常,減少 XML 配置 |
適用版本:Struts 2.3/2.5。現代項目建議遷移至 Spring MVC + @Valid + 全局異常處理器(@ControllerAdvice),架構更清晰、類型安全、易測試。