首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Struts2 輸入驗證錯誤處理機制:自定義 InputErrorAction 統一返回 JSON 錯誤信息

     編輯:Java 綜合教學

Struts2 輸入驗證錯誤處理機制:自定義 InputErrorAction 統一返回 JSON 錯誤信息

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

三、核心代碼實現

1. InputErrorAction(返回標準化 JSON)

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;  // 已手動輸出響應,不需視圖解析
    }
}

2. Spring 配置(applicationContext.xml)

<!-- 輸入錯誤處理 Action -->
<bean id="inputErrorAction" class="com.xkssh.action.InputErrorAction" />

3. Struts 配置(struts.xml)

<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":"輸入錯誤未通過驗證"}

瀏覽器 Network 面板顯示 302 重定向後返回統一 JSON 錯誤

五、進階擴展:區分錯誤類型返回不同代碼

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),架構更清晰、類型安全、易測試。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved