Hi,
I have slightly altered the MyOrder.java and Order.xml to explain my problem.
I created a ClientSet.java which contains as a member clientData and changed MyOrder.java to contain an array of ClientSet instead of ClientData.
Order.xml
<?xml version="1.0" encoding="UTF-8"?>
<Order reference="12343-AHSHE-314159">
<Name>Jean Smith</Name>
<Address>2000, Alameda de las Pulgas, San Mateo, CA 94403</Address>
<Item reference="RF-0001">
<Description>Stuffed Penguin</Description>
<Quantity>10</Quantity>
<UnitPrice>8.95</UnitPrice>
</Item>
<Item reference="RF-0034">
<Description>Chocolate</Description>
<Quantity>5</Quantity>
<UnitPrice>28.50</UnitPrice>
</Item>
<Item reference="RF-3341">
<Description>Cookie</Description>
<Quantity>30</Quantity>
<UnitPrice>0.85</UnitPrice>
</Item>
</Order>
public class MyOrder {
private String _ref;
// Changed ClientData to ClientSet as an array.
private ClientSet[] _client;
private Vector _items;
private float _total;
....
....
}
public class ClientSet {
private ClientData clntData;
public ClientData getClntData() {
return clntData;
}
public void setClntData(ClientData data) {
clntData = data;
}
}
ClientData.java and Item.java remain the same.
The mapping file I am using is as follows:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapping PUBLIC "-//EXOLAB/Castor Object Mapping DTD Version 1.0//EN"
"http://castor.exolab.org/mapping.dtd">
<mapping>
<class name="castorMapping.MyOrder">
<map-to xml="Order" />
<field name="Reference" type="java.lang.String">
<bind-xml name="reference" node="attribute" />
</field>
<field name="Total" type="float">
<bind-xml name="total-price" node="attribute" />
</field>
<field container="true" name="ClientSet" type="castorMapping.ClientSet" collection="array"/>
<field name="ItemsList" type="castorMapping.Item" collection="vector">
<bind-xml name="Item" />
</field>
</class>
<class name="castorMapping.ClientSet">
<field name="clntData" container="true" type="castorMapping.ClientData" />
</class>
<class name="castorMapping.ClientData">
<field name="Name" type="java.lang.String">
<bind-xml name="Name" node="element" />
</field>
<field name="Address" type="java.lang.String">
<bind-xml name="Address" node="element" />
</field>
</class>
<class name="castorMapping.Item">
<field name="_reference" type="java.lang.String" direct="true">
<bind-xml name="reference" node="attribute" />
</field>
<field name="_quantity" type="integer" direct="true">
<bind-xml name="Quantity" node="element" />
</field>
<field name="_unitPrice" type="float" direct="true">
<bind-xml name="UnitPrice" node="element" />
</field>
<field name="_description" type="string" direct="true">
<bind-xml name="Description" reference="false" node="element" transient="true" />
</field>
</class>
</mapping>
Umarshalling works fine, get an the following error while Marshalling:
java.lang.IllegalArgumentException: object is not an instance of declaring class
at java.lang.reflect.Method.invoke(Native Method)
at org.exolab.castor.mapping.loader.FieldHandlerImpl.getValue(FieldHandlerImpl.java:375)
at org.exolab.castor.xml.Marshaller.processContainerAttributes(Marshaller.java:1949)
at org.exolab.castor.xml.Marshaller.processContainerAttributes(Marshaller.java:1924)
at org.exolab.castor.xml.Marshaller.processContainerAttributes(Marshaller.java:1969)
at org.exolab.castor.xml.Marshaller.processContainerAttributes(Marshaller.java:1924)
at org.exolab.castor.xml.Marshaller.marshal(Marshaller.java:1174)
at org.exolab.castor.xml.Marshaller.marshal(Marshaller.java:774)
at castorMapping.testMapping.main(testMapping.java:71)
Any help would be greatly appreciated.
Thanks
Balaji Adikesavelu
