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


Reply via email to