如何使用递归类成员设置Struts表单

时间:2012-11-21 19:55:13

标签: java struts xdoclet

在为包含对同一个类的成员引用的类设置Struts表单时,我发现了一个问题。

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

  // Constructors, getters, setters
}

当访问包含表单的网页时,似乎进程进入无限循环,直到它返回异常。

我正在使用xdoclet生成表单,如果有任何帮助的话。

1 个答案:

答案 0 :(得分: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
}

因为当JVM尝试创建实例时,这确实会导致无限递归和StackOverflowError

你应该真正展示你正在使用的完整代码!

对于这种情况,Struts表单reset()方法是要使用的方法。您不在bean的内部属性中提供默认初始化,而是创建内部bean并在reset()方法内的外部bean中初始化它。