如何发布从simpleform XML的字节数组到REST服务器 [英] how to post a byte array from simpleform xml to REST server

查看:196
本文介绍了如何发布从simpleform XML的字节数组到REST服务器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用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操作的,而不是邮政然后我得到的Andr​​oid客户端。 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 as base64Binary in the XML. Based on your comment Simple XML has the following representation for byte[].

<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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆