如何发布从simpleform XML的字节数组到REST服务器 [英] how to post a byte array from simpleform xml to REST server
问题描述
我使用RestTemplate为Android客户端。我使用简单的XML注释对象相同的java对象与服务器端JAXB注释。我成功地发送/ recieving字符串和其他原始类型但对于有问题的字节数组。当我在JAXB侧看到服务器的字节数组,我从简单的XML发送转换成别的东西。下面是code ..
REST服务器上的 JAXB注释对象
的Bean;
进口javax.xml.bind.annotation.XmlRootElement;@XmlRootElement
公共类设备实现Serializable
{
私人最终静态长的serialVersionUID = 1L;
受保护的byte [] imageRef; 公用设备(){
超();
} 公众的byte [] getImageRef(){
返回imageRef;
} 公共无效setImageRef(字节[] imageRef){
this.imageRef = imageRef;
}
}
下面是REST服务器的样子..我使用Apache CXF为。
<豆的id =xmlBeanProvider级=org.apache.cxf.jaxrs.provider.XMLBeansElementProvider/>
<豆的id =jacksonJsonProvider级=。组织codehaus.jackson.jaxrs.JacksonJsonProvider/> < JAXRS:服务器ID =dataRESTService地址=/>
< JAXRS:serviceBeans>
<参考豆=MyDataRESTService/>
< / JAXRS:serviceBeans>
< JAXRS:供应商>
<参考豆=xmlBeanProvider/>
<参考豆=jacksonJsonProvider/>
< / JAXRS:供应商>
< / JAXRS:服务器>
<背景:组件扫描基包=com.xxx.restservices/>
和所述控制器
@Path(/ MYDATA)
@Produces(MediaType.APPLICATION_XML)
@Consumes(MediaType.APPLICATION_XML)
@服务
公共类MyDataRESTService
{
@POST
@Path(/ testpost)
公共字符串testPost(设备装置)
{
//device.getImageRef()返回[-41,109,-8]为字节
}
}
下面是如何在Android客户端的外观
块引用>简单的XML注释在Android对象
进口org.simpleframework.xml.Element;
进口org.simpleframework.xml.Root;@根
公共类设备实现Serializable
{
私人最终静态长的serialVersionUID = 1L;
@元件
受保护的byte [] imageRef; 公用设备(){
超();
} 公众的byte [] getImageRef(){
返回imageRef;
} 公共无效setImageRef(字节[] imageRef){
this.imageRef = imageRef;
}
}RestTemplate客户端简单的XML转换器
公共无效testPost()
{ RestTemplate restTemplate =新RestTemplate();
串行串行=新的持留();
。restTemplate.getMessageConverters()增加(新SimpleXmlHttpMessageConverter(串行));
。restTemplate.getMessageConverters()增加(新StringHttpMessageConverter());
。restTemplate.getMessageConverters()增加(新FormHttpMessageConverter()); 设备device =新的设备();
device.setImageRef(新的byte [] {1,2,3,4,5});
串响应= restTemplate.postForObject(http://10.0.0.3:8080/rest/mydata/testpost,装置为String.class);
assertNotNull(响应); }所以基本上,当我发送的字节数组的字节[] {1,2,3,4,5} 在服务器上我得到这个字节数组的 [ - 41,109,-8 ] 即可。我试图去code使用Base64在服务器端的思维,可能是简单的XML编码是它,但无法弄清楚是怎么回事?
同样的,如果我做一个GET操作的,而不是邮政然后我得到的Android客户端。 org.springframework.http.converter.HttpMessageNotReadableException所致NumberFormat的一个例外:java.lang.NumberFormatException:无效INT:AQ ==
在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)的任何帮助将大大AP preciated。
解决方案一个JAXB实现将期望
字节[]
重新presented为base64Binary的
中的XML。基于您的评论简单的XML具有以下再presentation为字节[]
。< imageRef长度=5大于1,2,3,4,5℃/ imageRef>
您将需要选择是否要使用从JAXB的
base64Binary的
重新presentation,还是从简单的XML专有重新presentation和使用换另一侧适配器/转换器,使其明白你选择重新presentation。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.
解决方案A JAXB implementation will expect a
byte[]
to be represented asbase64Binary
in the XML. Based on your comment Simple XML has the following representation forbyte[]
.<imageRef length="5">1, 2, 3, 4, 5</imageRef>
You will need to choose whether you want to use the
base64Binary
representation from JAXB, or the proprietary representation from Simple XML and use an adapter/converter for the other side to make it understand the representation you choose.这篇关于如何发布从simpleform XML的字节数组到REST服务器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!