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

Struts2 配置錯誤導致 NoSuchMethodException:action 方法映射機制深度解析

     編輯:程式設計綜合問答

錯誤現象

HTTP Status 500 - cn.it.shop.action.CategoryAction.1()
java.lang.NoSuchMethodException: cn.it.shop.action.CategoryAction.1()
    at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.getActionMethod(...)

根因分析

核心錯誤:Struts2 嘗試調用 CategoryAction.1() 方法,但該類中根本不存在名為 1 的方法。

Struts2 Action 映射機制

  1. 請求 URL:/update.action 或 /save.action
  2. ActionMapper 解析出 actionName=update、method=update
  3. ActionProxy 創建 CategoryAction 實例
  4. DefaultActionInvocation 通過反射調用 update() 方法

配置文件錯誤定位

查看提供的 struts.xml 片段:

<action name="*" class="cn.it.shop.action.CategoryAction">
    <result name="index">/index.jsp</result>
</action>

關鍵問題:name="*" 通配符匹配任意 action 名稱,但**缺少 method 屬性指定**或**動態方法調用配置**。

三種修正方案

方案一:動態方法調用(推薦,Struts2 核心特性)

<!-- struts.xml -->
<package name="default" namespace="/" extends="struts-default">
    <!-- 開啟動態方法調用 -->
    <constant name="struts.enable.DynamicMethodInvocation" value="true" />
    
    <action name="category/*" class="cn.it.shop.action.CategoryAction">
        <result name="index">/index.jsp</result>
    </action>
</package>

URL 格式:/category/update.action → 自動調用 update();/category/save.action → 調用 save()。

方案二:顯式配置每個 action(最穩健)

<action name="update" class="cn.it.shop.action.CategoryAction" method="update">
    <result name="index">/index.jsp</result>
</action>
<action name="save" class="cn.it.shop.action.CategoryAction" method="save">
    <result name="index">/index.jsp</result>
</action>

方案三:使用通配符 + {1} 佔位符(Struts2 通配符映射)

<action name="category/*" class="cn.it.shop.action.CategoryAction" method="{1}">
    <result name="index">/index.jsp</result>
</action>

機制:category/update → {1} 替換為 update → 調用 update()。

JSP 連結正確寫法

<%-- 方案一/三對應 --%>
<a href="<s:url action='category/update'/>">訪問 update</a>
<a href="<s:url action='category/save'/>">訪問 save</a>

<%-- 方案二對應 --%>
<a href="<s:url action='update'/>">訪問 update</a>
<a href="<s:url action='save'/>">訪問 save</a>

深度補充:為什麼報 .1()?

AnnotationValidationInterceptor 在驗證階段嘗試獲取 action 方法名進行註解驗證。當動態方法解析失敗時,Struts2 內部可能將方法名解析為索引 1(第一個匹配的方法),導致反射查找 getMethod("1") 失敗。

最佳實踐總結

總結

NoSuchMethodException: CategoryAction.1() 根因是 **Struts2 無法正確解析動態方法名**。修正核心:在 struts.xml 中明確配置 method 屬性或啟用通配符 {1} 映射。建議新手採用「顯式配置」方案,理解清楚 Action→Method 映射機制後,再遷移至約定式配置。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
場景推薦配置優點
少量固定方法顯式配置 method 屬性清晰、無魔法、易除錯
CRUD 標準化通配符 {1} 映射約定優於配置、擴展性強
REST 風格REST 插件或約定插件標準化、語義清晰