1

以前の開発者が Byte[] がオブジェクトを渡す一般的な形式になるような方法で作成した Axis2 Web サービス (既に実装され実行されている) を呼び出すことを想定している Android アプリケーションを開発しています。List を返す Web サービスを Axis2 で呼び出す必要があるとします。Web サービスはインスタンスを Byte[] に変換し、Byte[] を返します。クライアントはそれを元に変換します。

サービスのスニペットは次のとおりです。

public byte[] getMyPersonList() throws Exception {
    java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream();
    java.io.ObjectOutputStream oos = new java.io.ObjectOutputStream(baos);
    oos.writeObject(new List<Person>());
    return (baos.toByteArray());
}

クライアント(私のAndroidアプリケーションではなく、Webサービスを作成している同じ人々によって開発された既存のデスクトップアプリケーション)

byte[] buffer = (byte[]) serviceClient.invokeBlocking(methodName,
            new Object[] {}, new Class[] { byte[].class })[0];
java.io.ObjectInputStream ois = new java.io.ObjectInputStream(
            new java.io.ByteArrayInputStream(buffer));
return (List<Person>) ois.readObject();

invokeBlocking() メソッドは、サービスから返された値を自動的に byte[] に戻すように自動的に変換するようですが、アプリケーションで同じことを行うのに問題があります。

ブラウザから手動でサービスを呼び出すと、戻り値は次のようになります。

<return> rO0ABXNyABNqYXZhLnV0aWwuQXJyYXlMaXN0eIHSHZnHYZ0DAAFJAARzaXpleHAAAAAJdwQAAAAKc3IAJ3dvcmtmbG9....................... </return>

これまでに行ったことは、戻り値を文字列として直接取得し、getBytes() を使用することです。

byte [] soapReturnBytes = resultsRequestSOAP.getPropertyAsString("return").getBytes();
ObjectInputStream ois = new ObjectInputStream(bais);
myPersonList= (List<Person>) ois.readObject();

しかし、ストリームが壊れているというエラーを受け取りました。これは、元に戻すときに同じコンテンツではないことを意味する可能性があります。

だから私の質問は:

  1. Byte[] を返す場合、Axis2 エンジンは値を変換して SOAP の戻り値に適合させるために何をしますか?
  2. Web サービスについて何もできない場合に備えて、この「文字列化された」値を Byte[] に変換する方法は何ですか (Web サービスの変更はありません)。

どんな提案でも大歓迎です。

編集:

示唆されているように、デコーダーを使用して結果を取得していますが、まだうまくいきません:

String result = resultsRequestSOAP.getPropertyAsString("return");           
byte[] soapReturnBytes = Base64.decode(result, Base64.DEFAULT);
ByteArrayInputStream bais = new ByteArrayInputStream(soapReturnBytes);
ObjectInputStream ois = new ObjectInputStream(bais);
orgs = (List<Person>) ois.readObject();

私はまだ同じエラーを受け取りました:

java.io.StreamCorruptedException: Wrong format: 0

なにか提案を?イライラする

編集2:

String を byte[] として返す別のサービスを作成し、Android アプリケーションで byte[] を受け取り、それを元の String に変換しました。したがって、おそらく、Stream を使用して Object <=> byte [] を変換する方法と関係があります。

4

1 に答える 1

1

Byte[] を返す場合、Axis2 エンジンは値を変換して SOAP の戻り値に適合させるために何をしますか?

Java 型byte[]は XML スキーマ型にマップされますxsd:base64Binary。この変換は Base64 エンコーディングと呼ばれます。

Web サービスについて何もできない場合に備えて、この「文字列化された」値を Byte[] に変換する方法は何ですか (Web サービスの変更はありません)。

Base64 デコーダーを使用する必要があります。Commons Codec など、多数の Java 実装が利用可能です。

于 2012-11-26T20:07:26.240 に答える