Я использую RestTemplate для клиента Android. Я использую аннотированный объект Simple XML и тот же java-объект с аннотацией JaxB на стороне сервера. Я успешно отправляю/получаю String и другие примитивные типы, но для массива байтов возникают проблемы. Массив байтов, который я отправляю из Simple XML, преобразуется во что-то другое, когда я вижу на стороне JaxB на сервере. Ниже приведен код..
Аннотированный объект JaxB на сервере REST
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;
}
}
Вот как выглядит Rest-сервер. Для этого я использую Apache CXF.
<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" />
и контроллер
@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
}
}
Вот как выглядит клиентская часть Android
Простой XML-аннотированный объект на 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 с конвертерами Simple XML
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);
}
Таким образом, когда я отправляю массив байтов byte[]{1,2,3,4,5} на сервер, я получаю этот массив байтов [-41, 109, -8] сильный>. Я пытался декодировать с помощью Base64 на стороне сервера, думая, что это может быть простой xml, но не мог понять, что происходит?
Точно так же, если я выполняю операцию Get вместо Post, я получаю исключение NumberFormat в клиенте Android. в java.lang.Integer.invalidInt(Integer.java:138) в java.lang.Integer.parse(Integer.java:375) в java.lang.Integer.parseInt(Integer.java:366) в java.lang. Byte.parseByte(Byte.java:214) в java.lang.Byte.parseByte(Byte.java:195) в java.lang.Byte.valueOf(Byte.java:264) в org.simpleframework.xml.transform.ByteTransform .read(ByteTransform.java:55)
Любая помощь будет оценена.