struts2的java.lang.NoSuchMethodException异常处理
不久前在學習struts時出現(xiàn)這個錯誤,在網(wǎng)上搜索了半天,發(fā)現(xiàn)答案不一。將其總結(jié)如下,以方便大家參考。
1、
你有沒有試試看 其它的方法能不能用,要是都是這種情況的話,可能是你的Action類沒有繼承structs里面的DispatchAction或者其它的類。還有你注意下方法的參數(shù)列表,類型順序要正確才行,是按照以下順序的:ActionMapping mapping,ActionForm form ,HttpServletRequest request,HttpServletResponse response
2、
發(fā)現(xiàn)有兩種錯誤可能引起上述異常:
一.Action 類的方法被定義成private 類型.
如下Action 中被訪問的方法被定義成private 類型.程序在訪問其方法時,會拋出以上異常.
3、
其實java.lang.NoSuchMethodException這個異常的根本原因有兩個:第一,缺少某些jar文件;第二,某些jar文件有重復。
4、
使用struts2框架出現(xiàn)的問題
在頁面使用jquery ajax 調(diào)用action中的vaildUname方法,報錯,說我的方法不存在。但實際是存在的。
public String vaildUname(String loginName) throws Exception{}
問題就在這個參數(shù)上,struts2中是不能有參數(shù)的(具體我也不知道為什)
?
解決方法:
private String loginName;
public String vaildUname() throws Exception{}
loginName的getter和setter方法
這樣在使用ajax調(diào)用的時候,就可以了
·struts2是通過反射機制來執(zhí)行action的方法,struts2規(guī)范目前action方法是不需要參數(shù)的,有參數(shù)的方法和沒參數(shù)的方法是兩個不同的方法,所以會出現(xiàn)找不到的情況。
5、
jar版本不對
應該是3.6jar包的問題,換回3.2的包又沒事了
6、
java.lang.NoSuchMethodException 這個異常是指你的action里面沒有這個方法,說明已經(jīng)找到了action 但是沒有找到方法,所以有2個情況,
第1種情況是,你提交到的不是這個action ,查查配置文件,有沒有一樣的path
?
?
第2種情況,你的action里面沒有這個方法
?
?
?
下面是轉(zhuǎn)載的
?
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>
?
細心的朋友應該能夠發(fā)現(xiàn),因為復制粘貼惹的禍。導致同一命名空間下存在兩個同名的action定義,這不是關鍵,關鍵問題是,兩個同名action的實例引用是不一樣的,struts2是順序解析配置的action,如果我們請求saveOrUpdateBranch,struts2會在命名空間為/basedate里查找請求的action是否存在,如果存在就調(diào)用這個action,如果不存在報異常告訴用戶“在請求的命名空間中找不到指定的action”。這里我們請求的action是存在的,錯就錯在,它是順序解析,即便你第一個action定義無誤,但是它并未調(diào)用。它會繼續(xù)查找/basedate下的action,當它發(fā)現(xiàn)還有一個命名為saveOrUpdateBranch的action時,也是最后一個aciton時,它才調(diào)用這個請求的action。但是我們這里最后執(zhí)行的action的引用又確實不存在。
我們最后定義的這個同名的action的實例是class="carrierAction" 。事實上,實例carrierAction確實沒有"saveOrUpdateBranch"方法,所以struts2就拋出無法找到特定的方法的異常。
粗心大意害死人哦...
摘自 csh624366188的專欄
總結(jié)
以上是生活随笔為你收集整理的struts2的java.lang.NoSuchMethodException异常处理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设为首页 和 收藏本站js代码 兼容IE
- 下一篇: 在新建FileInputStream时使