Struts 異常 IllegalArgumentException
最近小玩Struts。改造項目。在測試時兩次發現
javax.servlet.ServletException: BeanUtils.populate
java.lang.IllegalArgumentException: argument type mismatch異常。
第一次,是由于在Form中定義的是String[] somethingID數組類型,而在jsp中定義的是
<html:hidden property="somethingID"/>,導致類型不匹配,從而出現異常。
第二次出現,原因比較隱蔽。容我慢慢道來。
兩個畫面,SomeList.jsp 和Some.jsp,分別對應SomeListForm,SomeListAction.java 和 SomeForm,SomeChangeAction.java。功能就是打開SomeList.jsp畫面,選擇某條Some進入SomeChange.jsp,修改好后返回SomeList.jsp。為了修正Session問題,在Some.jsp中添加了<html:hidden property="somethingID"/>,然后上面異常就發生了。
歷經挫折,跋山涉水后找到原因。在SomeListForm中有屬性String[] somethingID,數組類型,在SomeForm中有屬性String somethingID是單值String類型,名字一致類型不一樣。
當SomeChangeForm返回SomeListForm的時候,會將somethingID的值傳回。這時候就發生類型不匹配異常了。根本原因在于,配置struts-config.xml的時候,
<action attribute="someForm" input="/form/somechange.jsp" name="someForm"
path="/somechange" type="com.somecorp.struts.action.SomeChangeAction">
<forward name="display" path="/form/somechange.jsp" />
<forward name="return" path="/somelist.do" />
</action>
高亮這行沒有設置 redirect="true",這樣的話,返回時就會將上個Form的值返回從而導致不匹配異常。
path="/somechange" type="com.somecorp.struts.action.SomeChangeAction">
<forward name="display" path="/form/somechange.jsp" />
<forward name="return" path="/somelist.do" />
</action>
- 一般來說,這時候的Form是不需要將值返回的,改成<forward name="return" path="/somelist.do" redirect="true"/>就可以了。要注意其他參數的傳遞。
- 還有個改法就是將兩個Form中同名不同類型的屬性改個名字也可以。
==========打醬油的分割線====================
對于redirect="true"不理解的可以參考下面這段:
在ActionForward中有一個重要的屬性redirect,當redirect=false時,將保存存儲在http請求和請求上下文中的所有內容,僅在同一個應用中可用。當redirect=true時,Web客戶端進行一次新的http請求,請求的資源可以在同一個應用中,也可以不在,原來的請求參數不再保存,原來的請求上下文也被清除,新的http請求僅包含ActionForward的path屬性里所包含的參數。如果在同一個應用中,用戶會話的上下文會被維護。
posted on 2009-12-15 14:04 游雯 閱讀(301) 評論(0) 編輯 收藏 所屬分類: Java技術