Uploaded image for project: 'Commons BeanUtils'
  1. Commons BeanUtils
  2. BEANUTILS-28

BeanUtils.populate() does not handle nested properties of dynabean

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • Nightly Builds
    • None
    • None
    • None
    • Operating System: All
      Platform: All

    • 7521

    Description

      I am trying to use the new DynaActionForm (from Struts beta1) with nested
      properties, and it seems like that DynaActionForm ignores the nesting stuff.
      While checking out code, it appears like BeanUtils.populate() does not seem
      to traverse the property nesting. It works ok if I switch to regular form bean.

      Here are more details of the issue:

      Form bean configuration from struts-config:
      <form-bean name="cart"
      type="MyDynaActionForm"
      className="MyFormBeanConfig">
      <form-property name="name" type="java.lang.String"/>
      <form-property name="items" type="ShoppingItem[]"/>
      </form-bean>

      MyDynaActionForm is an extension to prevent "reset()" from clearing "items"
      array.
      MyFormBeanConfig is an extension to recognize MyDynaActionForm class name as
      dynamic.
      ShoppingItem is a bean with 3 properties - (String)id, (int)quantity, and
      (boolean) remove.

      Here is how my JSP looks:
      <nested:form action="/updateCart">
      <nested:text property="name"/>
      <TABLE>
      <nested:iterate id="it" property="items">
      <TR>
      <TD><nested:text property="id"/></TD>
      <TD><nested:text property="quantity"/></TD>
      <TD><nested:checkbox property="remove"/></TD>
      </TR>
      </nested:iterate>
      </TABLE>

      <nested:submit property="Update" value="Update"/>
      </nested:form>

      Generated html looks like (if I had two items in the shoppingItems array):
      <form name="cart" method="POST" action="/cart/updateCart.do">
      <input type="text" name="name">

      <TABLE>
      <TR>
      <TD><input type="text" name="items[0].id" value="first"></TD>
      <TD><input type="text" name="items[0].quantity" value="1"></TD>
      <TD><input type="checkbox" name="items[0].remove" value="on"></TD>
      </TR>

      <TR>
      <TD><input type="text" name="items[1].id" value="second"></TD>
      <TD><input type="text" name="items[1].quantity" value="2"></TD>
      <TD><input type="checkbox" name="items[1].remove" value="on"></TD>
      </TR>

      </TABLE>

      <input type="submit" name="Update" value="Update">
      </form>

      So, when the form is submitted as is,
      BeanUtils has to populate "items[0].id" to "first" etc.

      It invokes the equivalent of following on the dynaform bean.
      set("items", 0, "first") instead of get("items", 0).setId("first").

      To be more precise, it invokes:
      PropertyUtils.setIndexedProperty(bean, //the dynabean
      dynaName, // "items"
      index, // 0
      newValue // "first"
      );
      It should really have done
      Object subbean = PropertyUtils.getIndexedProperty(bean, // the dynabean
      dynaName, //"items"
      index); //0
      PropertyUtils.setProperty(subbean,
      dynaName, // "id"
      value);//"first"

      Attachments

        Activity

          People

            Unassigned Unassigned
            amandava@yahoo.com Anil Mandava
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: