我正在使用WebSphere 5.1.2并认为它是Struts 1,但我不确定。
我的问题如下。
我在表单中有一个bean BeanName的动态列表,输入类型为text。
我的表单是这样的(无法复制和粘贴,因为它位于没有Internet的虚拟机上):
public class MyForm extends ActionForm implements Serializable {
// Property
private List beanNameList = new ArrayList();
// Simple Getter
public List getBeanNameList() {
if (beanNameList == null) {
beanNameList = new ArrayList();
}
return beanNameList ;
}
// Item Getter
public BeanName getBeanNameList(int index) {
if (beanNameList == null) {
beanNameList = new ArrayList();
}
for (int i = beanNameList.size(); i <= index; i++) {
beanNameList.add(new BeanName());
}
return (BeanName)contractList.get(index);
}
// Simple Setter
public List setBeanNameList(List value) {
return beanNameList = value;
}
// Item Setter
public BeanName getBeanNameList(int index, BeanName value) {
if (beanNameList == null) {
beanNameList = new ArrayList();
}
for (int i = beanNameList.size(); i <= index; i++) {
beanNameList.add(new BeanName());
}
contractList.set(index, value);
}
}
当我提交表单时,收到IndexOutOfBoundsException:index:3,size:0。
分析控制台,我意识到Struts正在使用ArrayList.get,而不是getBeanNameList,如图所示:
有什么想法吗?
答案 0 :(得分:1)
我发现了问题...
我的Struts版本太旧了,它真的不使用带有siganture索引的getter和setter,它使用的是ArrayList.get,或类似的东西。
为了解决这个问题,我创建了一个隐藏字段,其大小与我的列表相同,在表单的重置方法上,我只是设置了列表的大小。