在为包含对同一个类的成员引用的类设置Struts表单时,我发现了一个问题。
class ExampleBean {
Integer id;
String name;
ExampleBean parent;
// Constructors, getters, setters
}
当访问包含表单的网页时,似乎进程进入无限循环,直到它返回异常。
我正在使用xdoclet生成表单,如果有任何帮助的话。
答案 0 :(得分:1)
您没有提供足够的信息(因此我只能猜测发生了什么)但我不认为这是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中初始化它。