2012-11-21 24 views
-1

我在爲包含對同一類的成員引用的類設置Struts表單時發現問題。如何使用遞歸類成員設置Struts表單

class ExampleBean { 
    Integer id; 
    String name; 
    ExampleBean parent; 

    // Constructors, getters, setters 
} 

當訪問包含表單的網頁時,似乎進程進入無限循環,直到它返回一個異常。

我正在使用xdoclet生成表單,如果有任何幫助的話。

回答

1

您沒有提供足夠的信息(所以我只能猜測發生了什麼),但我不認爲這是Struts的問題。

當您在Struts表單中使用嵌套屬性時,請爲您的HTML輸入名稱指定如下內容:parent.idparent.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中初始化它。