AndroidクライアントにRestTemplateを使用しています。私は単純な XML 注釈付きオブジェクトと、サーバー側で JaxB 注釈付きの同じ Java オブジェクトを使用しています。String やその他のプリミティブ型の送受信には成功していますが、バイト配列には問題があります。シンプル XML から送信しているバイト配列は、サーバーの JaxB 側で見ると別のものに変換されます。以下はコードです..
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がエンコードされている可能性があると考えていましたが、何が起こっているのかわかりませんでしたか?
同様に、Post の代わりに Get 操作を行うと、Android クライアントで NumberFormat 例外が発生します。 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)
どんな助けでも大歓迎です。