我正在将 RestTemplate 用于 android 客户端。我在服务器端使用带有 JaxB 注释的简单 XML 注释对象和相同的 java 对象。我成功发送/接收字符串和其他原始类型,但字节数组有问题。当我在服务器的 JaxB 端看到时,我从 Simple XML 发送的字节数组被转换为其他内容。下面是代码..
REST 服务器上的 JaxB 注释对象
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 客户端的外观
Android 上的简单 XML 注释对象
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;
}
}
带有简单 XML 转换器的 RestTemplate 客户端
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,那么我会在 android 客户端中得到 NumberFormat 异常。org.springframework.http.converter.HttpMessageNotReadableException 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)
任何帮助将不胜感激。