在为包含对同一类的成员引用的类设置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
}
因为当JVM尝试创建实例时,这确实会导致无限递归和StackOverflowError
。
你真的应该展示你正在使用的完整代码!
对于这种情况,Struts形式的reset()
方法就是要使用的方法您没有在bean的内部属性中提供默认初始化,而是创建内部bean并在reset()
方法内的外部bean中对其进行初始化。