不久前在學(xué)習(xí)struts時(shí)出現(xiàn)這個(gè)錯(cuò)誤,在網(wǎng)上搜索了半天,發(fā)現(xiàn)答案不一。將其總結(jié)如下,以方便大家參考。
1、
你有沒(méi)有試試看 其它的方法能不能用,要是都是這種情況的話,可能是你的Action類沒(méi)有繼承structs里面的DispatchAction或者其它的類。還有你注意下方法的參數(shù)列表,類型順序要正確才行,是按照以下順序的:ActionMapping mapping,ActionForm form ,HttpServletRequest request,HttpServletResponse response
2、
發(fā)現(xiàn)有兩種錯(cuò)誤可能引起上述異常:
一.Action 類的方法被定義成 PRivate 類型.
如下 Action 中被訪問(wèn)的方法被定義成 private 類型.程序在訪問(wèn)其方法時(shí),會(huì)拋出以上異常.
3、
其實(shí)java.lang.NoSuchMethodException這個(gè)異常的根本原因有兩個(gè):第一,缺少某些jar文件;第二,某些jar文件有重復(fù)。
4、
使用struts2框架出現(xiàn)的問(wèn)題在頁(yè)面使用jquery Ajax 調(diào)用action中的vaildUname方法,報(bào)錯(cuò),說(shuō)我的方法不存在。但實(shí)際是存在的。public String vaildUname(String loginName) throws Exception{}問(wèn)題就在這個(gè)參數(shù)上,struts2中是不能有參數(shù)的(具體我也不知道為什)解決方法:private String loginName;public String vaildUname() throws Exception{}loginName的getter和setter方法這樣在使用ajax調(diào)用的時(shí)候,就可以了
· struts2是通過(guò)反射機(jī)制來(lái)執(zhí)行action的方法,struts2規(guī)范目前action方法是不需要參數(shù)的,有參數(shù)的方法和沒(méi)參數(shù)的方法是兩個(gè)不同的方法,所以會(huì)出現(xiàn)找不到的情況。
5、
jar版本不對(duì)
應(yīng)該是3.6jar包的問(wèn)題,換回3.2的包又沒(méi)事了
6、
java.lang.NoSuchMethodException 這個(gè)異常是指你的action里面沒(méi)有這個(gè)方法,說(shuō)明已經(jīng)找到了action 但是沒(méi)有找到方法,所以有2個(gè)情況,
第1種情況是,你提交到的不是這個(gè)action ,查查配置文件,有沒(méi)有一樣的path第2種情況,你的action里面沒(méi)有這個(gè)方法
下面是轉(zhuǎn)載的
public class NoSuchMethodExceptionextends Exception無(wú)法找到某一特定方法時(shí),拋出該異常。
————————————————————————————————————————
事實(shí)上我有特定的方法,為什么struts2報(bào)此異常呢?
以下是struts2配置文件片段:
<package name=”basedate” extends=”struts-default” namespace=”/basedate”><!– 服務(wù)商管理 –> <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><!– 運(yùn)輸商管理 –> <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>
細(xì)心的朋友應(yīng)該能夠發(fā)現(xiàn),因?yàn)閺?fù)制粘貼惹的禍。導(dǎo)致同一命名空間下存在兩個(gè)同名的action定義,這不是關(guān)鍵,關(guān)鍵問(wèn)題是,兩個(gè)同名action的實(shí)例引用是不一樣的,struts2是順序解析配置的action,如果我們請(qǐng)求saveOrUpdateBranch,struts2會(huì)在命名空間為/basedate里查找請(qǐng)求的action是否存在,如果存在就調(diào)用這個(gè)action,如果不存在報(bào)異常告訴用戶“在請(qǐng)求的命名空間中找不到指定的action”。這里我們請(qǐng)求的action是存在的,錯(cuò)就錯(cuò)在,它是順序解析,即便你第一個(gè)action定義無(wú)誤,但是它并未調(diào)用。它會(huì)繼續(xù)查找/basedate下的action,當(dāng)它發(fā)現(xiàn)還有一個(gè)命名為saveOrUpdateBranch的action時(shí),也是最后一個(gè)aciton時(shí),它才調(diào)用這個(gè)請(qǐng)求的action。但是我們這里最后執(zhí)行的action的引用又確實(shí)不存在。我們最后定義的這個(gè)同名的action的實(shí)例是class=”carrierAction” 。事實(shí)上,實(shí)例carrierAction確實(shí)沒(méi)有”saveOrUpdateBranch”方法,所以struts2就拋出無(wú)法找到特定的方法的異常。
粗心大意害死人哦 …
這篇文章是轉(zhuǎn)載的,原文博客鏈接是這里寫(xiě)鏈接內(nèi)容
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注