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>