Hello Jianyu,

Your unique-row-id (oid) must be a String. It is somewhere in the Woody
documentation and there is a comment in the sources that some conversion
routines should be added. The Long appears in your <wd:repeater> in the form
definition, and in your AddressBean Java class.

Hugo

> -----Original Message-----
> From: Jianyu Wang [mailto:[EMAIL PROTECTED]
> Sent: Thursday, September 18, 2003 5:50 PM
> To: [EMAIL PROTECTED]
> Subject: Help about how to use Repeater--bean binding
>
>
> hi,
> I have a problem when I use repeater  to add a new row in the
> form and later
> save it into bean. I get the Exception like these:
>
> org.apache.commons.jxpath.JXPathException: Exception trying to
> create xpath
> addresses[1]; org.apache.cocoon.woody.binding.InsertBeanJXP
> athBinding.access$000(Lorg/apache/cocoon/woody/binding/InsertBeanJ
> XPathBindi
> ng;)Ljava/lang/String;
>         at
> org.apache.commons.jxpath.ri.JXPathContextReferenceImpl.createPath
> (JXPathCon
> textReferenceImpl.java:420)
>         at
> org.apache.commons.jxpath.ri.JXPathContextReferenceImpl.createPath
> (JXPathCon
> textReferenceImpl.java:397)
>         at
> org.apache.cocoon.woody.binding.RepeaterJXPathBinding.saveFormToMo
> del(Repeat
> erJXPathBinding.java:233)
>         at
> org.apache.cocoon.woody.binding.ComposedJXPathBindingBase.saveForm
> ToModel(Co
> mposedJXPathBindingBase.java:108)
>         at
> org.apache.cocoon.woody.binding.ContextJXPathBinding.saveFormToMod
> el(Context
> JXPathBinding.java:107)
>         at
> org.apache.cocoon.woody.binding.JXPathBindingBase.saveFormToModel(
> JXPathBind
> ingBase.java:115)
>
>
> my form defination is :
>
>   <wd:repeater id="addresses">
>       <wd:output id="oid">
>         <wd:datatype base="long"/>
>       </wd:output>
>
>         <wd:field id="street" required="true">
>          <wd:label><i18n:text>Street</i18n:text></wd:label>
>          <wd:datatype base="string">
>             <wd:validation>
>               <wd:length min="2"/>
>             </wd:validation>
>           </wd:datatype>
>         </wd:field>
>
>         <wd:booleanfield id="address-select">
>        <wd:label>Select</wd:label>
>       </wd:booleanfield>
>
>    </wd:repeater>
>
> and bind data like this:
>
>   <wb:repeater id="addresses"
>     parent-path="."
>     row-path="addresses"
>     unique-row-id="oid"
>     unique-path="@oid"
>     >
>     <!-- important note: the row-path is used inside jxpath-createPath
> context,
>          as a consequence it cannot have dependent children or predicates
> -->
>
>     <wb:on-bind>
>       <!-- executed on updates AND right after the insert -->
>       <wb:value id="street" path="street"/>
>     </wb:on-bind>
>
>     <wb:on-delete-row>-->
>       <!-- chose on of these to test -->
>       <!--
>       <wb:set-attribute name="row-state" value="deleted" />
>       -->
>       <wb:delete-node />
>     </wb:on-delete-row>
>
>     <wb:on-insert-row>
>       <wb:insert-bean
>         classname="com.imkenberg.bo.address.impl.AddressBean"
>         addmethod="addAddress"/>
>     </wb:on-insert-row>
>   </wb:repeater>
>
> And then the parent Bean has properties like this:
> public abstract class DefaultPartyBean implements Party {
>     private Long oid;
>     private String email;
>     private String password;
>     protected List addresses = new LinkedList();
> and also methods.
>     public PartyAddress getAddress()
>     public void addAddress( PartyAddress address )
>     public Iterator getAddressIterator()
>     public List getAddresses()
>     public void setAddresses( List addresses )
>
> And the AddressBean is simplely like this:
> public class AddressBean implements Address {
>     private Long oid;
>     private String city;
>     private String country;
>     private String houseNo;
>     private String zip;
>     private String street;
>     private long type;
> with get and set methods.
>
> I am glad for your helping
>
> Thanks
>
> Jianyu
>

Reply via email to