我在爲包含對同一類的成員引用的類設置Struts表單時發現問題。如何使用遞歸類成員設置Struts表單
class ExampleBean {
Integer id;
String name;
ExampleBean parent;
// Constructors, getters, setters
}
當訪問包含表單的網頁時,似乎進程進入無限循環,直到它返回一個異常。
我正在使用xdoclet生成表單,如果有任何幫助的話。
我在爲包含對同一類的成員引用的類設置Struts表單時發現問題。如何使用遞歸類成員設置Struts表單
class ExampleBean {
Integer id;
String name;
ExampleBean parent;
// Constructors, getters, setters
}
當訪問包含表單的網頁時,似乎進程進入無限循環,直到它返回一個異常。
我正在使用xdoclet生成表單,如果有任何幫助的話。
您沒有提供足夠的信息(所以我只能猜測發生了什麼),但我不認爲這是Struts的問題。
當您在Struts表單中使用嵌套屬性時,請爲您的HTML輸入名稱指定如下內容:parent.id
和parent.name
。
當Struts在使用請求數據填充動作表單時發現此問題時,它會嘗試在表單上執行getParent().setId(...)
和getParent().setName(...)
。
如果getParent()
返回null,則會從BeanUtils中得到一個錯誤,如java.lang.IllegalArgumentException: No bean specified
。所以爲了使內部bean綁定起作用,你必須初始化它,然後讓Struts執行綁定。
以任何機會沒有你做這樣的事情:
class ExampleBean {
Integer id;
String name;
ExampleBean parent = new ExampleBean();
// Constructors, getters, setters
}
,因爲這將導致確實無限遞歸和StackOverflowError
當JVM嘗試創建一個實例。
你應該真的顯示你正在使用的完整代碼!
對於這樣的情況,需要使用Struts表單reset()
方法。您不在bean的內部屬性中提供默認初始化,而是創建內部bean並在reset()
方法內的外部bean中初始化它。