You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@struts.apache.org by Colin Wilson-Salt <co...@bluecycle.com> on 2002/07/23 10:35:38 UTC
Setting indexed properties - ArrayIndexOutOfBounds
Hi everyone. I've looked through the archives for this and the commons list,
without finding an answer to my problems with receiving indexed properties
from a form.
I've tried with both 1.1 beta and a nightly build from a couple of nights
ago. I'm not sure if my problem is with Struts, Commons / BeanUtils, or my
understanding of how indexed properties on a bean work.
I have a form which, amongst other things, has a tabular set of data:
...
<input type="hidden" name="rows[0].id" value="ROW1-PAINT">
<input type="hidden" name="rows[0].name" value="Paint colour">
<td></td>
<td>Paint colour</td>
<td><input type="text" name="rows[0].value" value="Blue"></td>
<td></td>
</tr>
...
In my form bean I have represented this with an indexed property.
...
public Row [] getRows() {
if (rows == null)
setRows(new Row [0]);
return rows;
}
public void setRows(Row [] rows) {
this.rows = rows;
}
...
Where Row is an inner (nested? never sure of the terminology - defined as
public static inside the form bean, anyway).
My problem is when Struts comes to populate my form bean with values from
the form. Instead of creating a new Row [] and calling setRows, it calls
getRows and then attempts to set values within the array. Trouble is, the
array isn't big enough, leading to an ArrayIndexOutOfBoundsException. And
there's no way I can tell how big to make the array, as the size of the form
varies.
So, I tried using a List instead of an array. But with the same result -
Struts would grab the list from public List getRows(), and then attempt to
set values at indexes within the list.
So, in desperation, I went back to my array version and added a getter and
setter that would take an index, but would 'resize' the array when the index
would be out of bounds:
...
public Row getRows(int i) {
if (i >= getRows().length)
increaseRows(i + 1);
return getRows()[i];
}
public void setRows(int i, Row row) {
if (i >= getRows().length)
increaseRows(i + 1);
getRows()[i] = row;
}
...
Now, that works. But I'm not very satisfied. I would have thought that, in
my original code, the only proper way to change values of the property would
be to create a new array and pass it to public void setRows(Row [] rows).
One argument for this is (thinking only of JavaBeans, not Struts) if the
property was bound, and the array was changed behind the objects back, it
wouldn't know to fire a PropertyChangeEvent.
So, is this a bug in Struts / Commons-BeanUtils? Or a flaw in my
understanding of JavaBeans? Or just a limitation I have to live with? Is the
workaround above 'legal' in terms of the JavaBeans spec? Is there a nicer
way to achieve what I'm trying to do?
Thanks in advance...
--
To unsubscribe, e-mail: <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>