I am using RestTemplate for android client. I am using Simple XML annotated object and same java object with JaxB annotation on server side. I am successful in sending/recieving String and other primitive types but for byte array having problems. The byte array I am sending from Simple XML is converted to something else when I see on JaxB side on server. Below is the code..
JaxB annotated object on REST server
import java.io.Serializable;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Device implements Serializable
{
private final static long serialVersionUID = 1L;
protected byte[] imageRef;
public Device() {
super();
}
public byte[] getImageRef() {
return imageRef;
}
public void setImageRef(byte[] imageRef) {
this.imageRef = imageRef;
}
}
Here is how the Rest server looks like.. I am using Apache CXF for that.
<bean id="xmlBeanProvider" class="org.apache.cxf.jaxrs.provider.XMLBeansElementProvider"/>
<bean id="jacksonJsonProvider" class="org.codehaus.jackson.jaxrs.JacksonJsonProvider"/>
<jaxrs:server id="dataRESTService" address="/">
<jaxrs:serviceBeans>
<ref bean="MyDataRESTService"/>
</jaxrs:serviceBeans>
<jaxrs:providers>
<ref bean="xmlBeanProvider"/>
<ref bean="jacksonJsonProvider"/>
</jaxrs:providers>
</jaxrs:server>
<context:component-scan base-package="com.xxx.restservices" />
and the controller
@Path("/mydata")
@Produces(MediaType.APPLICATION_XML)
@Consumes(MediaType.APPLICATION_XML)
@Service
public class MyDataRESTService
{
@POST
@Path("/testpost")
public String testPost(Device device)
{
//device.getImageRef() returns [-41, 109, -8] for the bytes
}
}
Here is how the Android client side looks
Simple XML Annotated object on Android
import org.simpleframework.xml.Element;
import org.simpleframework.xml.Root;
@Root
public class Device implements Serializable
{
private final static long serialVersionUID = 1L;
@Element
protected byte[] imageRef;
public Device() {
super();
}
public byte[] getImageRef() {
return imageRef;
}
public void setImageRef(byte[] imageRef) {
this.imageRef = imageRef;
}
}
RestTemplate client with Simple XML converters
public void testPost()
{
RestTemplate restTemplate = new RestTemplate();
Serializer serializer = new Persister();
restTemplate.getMessageConverters().add(new SimpleXmlHttpMessageConverter(serializer));
restTemplate.getMessageConverters().add(new StringHttpMessageConverter());
restTemplate.getMessageConverters().add(new FormHttpMessageConverter());
Device device = new Device();
device.setImageRef(new byte[]{1,2,3,4,5});
String response = restTemplate.postForObject("http://10.0.0.3:8080/rest/mydata/testpost", device, String.class);
assertNotNull(response);
}
So basically when I send byte array of byte[]{1,2,3,4,5} on server I get this byte array [-41, 109, -8]. I tried to decode with Base64 on server side thinking that may be simple xml is encoding it but couldn't figure out what is going on?
Similarly if I do a Get operation instead of Post then I get a NumberFormat exception in android client.. org.springframework.http.converter.HttpMessageNotReadableException Caused by: java.lang.NumberFormatException: Invalid int: "AQ==" at java.lang.Integer.invalidInt(Integer.java:138) at java.lang.Integer.parse(Integer.java:375) at java.lang.Integer.parseInt(Integer.java:366) at java.lang.Byte.parseByte(Byte.java:214) at java.lang.Byte.parseByte(Byte.java:195) at java.lang.Byte.valueOf(Byte.java:264) at org.simpleframework.xml.transform.ByteTransform.read(ByteTransform.java:55)
Any help will be greatly appreciated.