Hey Frank,
if you don't insist in using an int array in your IntObject, I can suggest to
use a List for the time being.
I got the following example working:
The domain class:
public class IntObject {
private List ints;
public final List getInts() {
return ints;
}
public final void setInts(List ints) {
this.ints = ints;
}
}
The handler:
public class IntConvert extends GeneralizedFieldHandler {
public IntConvert() {
super();
setCollectionIteration(false);
}
@Override
public Object convertUponGet(Object value) {
System.out.println("convertUponGet");
StringBuffer keyString = new StringBuffer();
List<Integer> list = (List<Integer>) value;
Iterator<Integer> it = list.iterator();
while(it.hasNext()) {
keyString.append(it.next() + " ");
}
return keyString.toString();
}
@Override
public Object convertUponSet(Object value) {
System.out.println("convertUponSet");
if (value == null)
return null;
String[] keyArray = ((String) value).split(" ");
List<Integer> list = new ArrayList<Integer>(keyArray.length);
for (int i = 0; i < keyArray.length; i++) {
list.add(Integer.parseInt(keyArray[i]));
}
return list;
}
@Override
public Class getFieldType() {
System.out.println("getFieldType");
return List.class;
}
}
I am using this mapping:
<mapping>
<class name="xml.template.IntObject">
<map-to xml="data-object" />
<field name="ints" type="java.lang.String"
handler="xml.template.IntConvert">
<bind-xml name="ints" node="element" />
</field>
</class>
</mapping>
Hope, this helps.
Regards,
Lukas
Frank314 schrieb:
> I'm having troubles converting from int[] in Java to a String in XML. My data
> XML looks like this:
>
>
>
> <?xml version="1.0" encoding="UTF-8"?>
> <data-object>
> <ints>3 1 4 1 5 </ints>
> </data-object>
>
>
>
> and I have an IntObject.java:
> public class IntObject {
> private int [] ints;
>
> public int[] getInts() {
> return ints;
> }
>
> public void setInts(int[] ints) {
> this.ints = ints;
> }
> }
>
>
>
> I'm trying to map this with the following mapping
>
>
> <mapping>
> <class name="castortest.IntObject">
> <map-to xml="data-object" />
> <field name="Ints" collection="array" type="java.lang.String"
> handler="castortest.IntConvert">
> <bind-xml name="ints" node="element"/>
> </field>
> </class>
> </mapping>
>
>
> and the following IntConvert.java:
>
>
>
> import java.util.Enumeration;
> import org.exolab.castor.mapping.GeneralizedFieldHandler;
> public class IntConvert extends GeneralizedFieldHandler
> {
> public IntConvert() {
> super();
> setCollectionIteration(false);
> }
>
> /**
> * From int[] to String
> *
> public Object convertUponGet(Object value) {
> StringBuffer keyString = new StringBuffer();
> for (Enumeration<Integer> ae = (Enumeration<Integer>) value;
> ae.hasMoreElements() ;) {
> keyString.append(ae.nextElement()+" ");
> }
> return keyString.toString();
> }
>
>
> /**
> * From String to int []
> *
> public Object convertUponSet(Object value) {
> if (value == null) return null;
>
> String [] keyArray = ((String) value).split(" ");
> int [] intArray = new int[keyArray.length];
> for (int i = 0; i < intArray.length; i++) {
> intArray[i] = Integer.parseInt(keyArray[i]);
> }
>
> return intArray;
> }
>
> public Class<?> getFieldType() {
> System.out.println("getFieldType");
> int test [] = new int [] {3};
> return test.getClass();
> }
>
> public Object newInstance( Object parent )
> throws IllegalStateException
> {
> System.out.println("hmm");
> //-- Since it's marked as a string...just return null,
> //-- it's not needed.
> return null;
> }
> }
>
>
>
>
> Marshalling works, but I get an error when Unmarshalling:
> org.exolab.castor.xml.MarshalException: Type conversion error: could not set
> value of [EMAIL PROTECTED] with value of type
> java.lang.String{File: [not available]; line: 3; column: 28}
> at
> org.exolab.castor.xml.Unmarshaller.convertSAXExceptionToMarshalException(Unmarshaller.java:761)
> at org.exolab.castor.xml.Unmarshaller.unmarshal(Unmarshaller.java:727)
> at org.exolab.castor.xml.Unmarshaller.unmarshal(Unmarshaller.java:616)
> at castortest.UnmarshallerTest.main(UnmarshallerTest.java:29)
> Caused by: java.lang.IllegalArgumentException: Type conversion error: could
> not set value of [EMAIL PROTECTED] with value of type
> java.lang.String
> at
> org.exolab.castor.mapping.loader.FieldHandlerImpl.setValue(FieldHandlerImpl.java:512)
> at
> org.exolab.castor.xml.UnmarshalHandler.endElement(UnmarshalHandler.java:1068)
> at
> org.exolab.castor.xml.UnmarshalHandler.endElement(UnmarshalHandler.java:1159)
> at
> com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:601)
> (longer stack trace down)
>
>
>
>
> Note that I'm using setCollectionIteration(false); because I want my XML to
> only contain one <ints>3 1 4 1 5 </ints> line, not
> <ints>3</ints><ints>1</ints> etc.
>
> It does work when I change the last line of IntConvert to
>
> return intArray[0]; // only returning first item
> }
>
> but then I only get back one number; it doesn't add all numbers.
>
> Any suggestions?
---------------------------------------------------------------------
To unsubscribe from this list, please visit:
http://xircles.codehaus.org/manage_email