1. 程式人生 > >struts2的java lang NoSuchMethodException異常處理

struts2的java lang NoSuchMethodException異常處理

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

不久前在學習struts時出現這個錯誤,在網上搜索了半天,發現答案不一。將其總結如下,以方便大家參考。

1、

你有沒有試試看 其它的方法能不能用,要是都是這種情況的話,可能是你的Action類沒有繼承structs裡面的DispatchAction或者其它的類。還有你注意下方法的引數列表,型別順序要正確才行,是按照以下順序的:ActionMapping mapping,ActionForm form ,HttpServletRequest request,HttpServletResponse response

2

發現有兩種錯誤可能引起上述異常:

一.Action 類的方法被定義成 private 型別.

如下 Action 中被訪問的方法被定義成 private 型別.程式在訪問其方法時,會丟擲以上異常.

3

其實java.lang.NoSuchMethodException這個異常的根本原因有兩個:第一,缺少某些jar檔案;第二,某些jar檔案有重複。

4

使用struts2框架出現的問題
在頁面使用jquery ajax 呼叫action中的vaildUname

方法,報錯,說我的方法不存在。但實際是存在的。
public String vaildUname(String loginName) throws Exception{}
問題就在這個引數上,struts2中是不能有引數的(具體我也不知道為什)

解決方法:
private String loginName;
public String vaildUname() throws Exception{}
loginNamegettersetter方法
這樣在使用ajax呼叫的時候,就可以了

· struts2是通過反射機制來執行action的方法,struts2規範目前action方法是不需要引數的,有引數的方法和沒引數的方法是兩個不同的方法,所以會出現找不到的情況。 

5

jar版本不對

應該是3.6jar包的問題,換回3.2的包又沒事了

6

java.lang.NoSuchMethodException 這個異常是指你的action裡面沒有這個方法,說明已經找到了action 但是沒有找到方法,所以有2個情況,

第1種情況是,你提交到的不是這個action ,查查配置檔案,有沒有一樣的path


2種情況,你的action裡面沒有這個方法

 

 

 

下面是轉載的

 

public class NoSuchMethodException
extends Exception

無法找到某一特定方法時,丟擲該異常。

------------------------------------------------------------------------------------------------------------------------

事實上我有特定的方法,為什麼struts2報此異常呢?

以下是struts2配置檔案片段:

     <package name="basedate" extends="struts-default" namespace="/basedate">
<!-- 服務商管理 -->
        <action name="saveOrUpdateBranch" class="branchAction" method="saveOrUpdateBranch">
            <result name="success">/WEB-INF/pages/srvclink/basedate/branch/branch.jsp</result>
            <result name="input">/WEB-INF/pages/srvclink/basedate/branch/branch.jsp</result>
        </action>
        <action name="editBranch" class="branchAction" method="editBranch">
            <result name="success">/WEB-INF/pages/srvclink/basedate/branch/branch.jsp</result>
        </action>
        <action name="deleteBranch" class="branchAction" method="deleteBranch">
            <result name="success" type="redirect">saveOrUpdateBranch.action?isNew=true</result>
        </action>
        <action name="searchBranch" class="branchAction" method="searchBranch">
            <result name="success">/WEB-INF/pages/srvclink/basedate/branch/branch.jsp</result>
        </action>

<!-- 運輸商管理 -->
        <action name="saveOrUpdateBranch" class="carrierAction" method="saveOrUpdateBranch">
            <result name="success">/WEB-INF/pages/srvclink/basedate/carrier/carrier.jsp</result>
        </action>
        <action name="editCarrier" class="carrierAction" method="editCarrier">
            <result name="success">/WEB-INF/pages/srvclink/basedate/carrier/carrier.jsp</result>
        </action>
        <action name="deleteCarrier" class="carrierAction" method="deleteCarrier">
            <result name="success" type="redirect">saveOrUpdateCarrier.action?isNew=true</result>
        </action>
        <action name="searchCarrier" class="carrierAction" method="searchCarrier">
            <result name="success">/WEB-INF/pages/srvclink/basedate/carrier/carrier.jsp</result>
        </action>
    </package>


細心的朋友應該能夠發現,因為複製貼上惹的禍。導致同一名稱空間下存在兩個同名的action定義,這不是關鍵,關鍵問題是,兩個同名action的例項引用是不一樣的,struts2是順序解析配置的action,如果我們請求saveOrUpdateBranch,struts2會在名稱空間為/basedate裡查詢請求的action是否存在,如果存在就呼叫這個action,如果不存在報異常告訴使用者“在請求的名稱空間中找不到指定的action”。這裡我們請求的action是存在的,錯就錯在,它是順序解析,即便你第一個action定義無誤,但是它並未呼叫。它會繼續查詢/basedate下的action,當它發現還有一個命名為saveOrUpdateBranch的action時,也是最後一個aciton時,它才呼叫這個請求的action。但是我們這裡最後執行的action的引用又確實不存在。
我們最後定義的這個同名的action的例項是class="carrierAction" 。事實上,例項carrierAction確實沒有"saveOrUpdateBranch"方法,所以struts2就丟擲無法找到特定的方法的異常。

粗心大意害死人哦 ...

 

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述