Hugo Burm wrote:
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
Hugo,
I've created a fix for the mentioned TODO's and am updating the samples to include the long datatype to show off this new support for convertors on the row_ID field of the repeaters.
Maybe odd at first sight but the consequence of this is that if you have a backend that is strongly typed (i.e. it produces Java Objects and beans rather then the typical Strings of the XML backend) then one will NOT NEED TO DEFINE the convertor.
will check in right away, Jianyu, could you verify that this is solving your problems?
regards, -marc=
-----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
-- Marc Portier http://outerthought.org/ Outerthought - Open Source, Java & XML Competence Support Center Read my weblog at http://radio.weblogs.com/0116284/ [EMAIL PROTECTED] [EMAIL PROTECTED]
