1

次の方法で画像を受け入れる Web サービスに TIFF 画像を送信しようとしています (これはもちろん、より大きな WSDL の一部にすぎません)。

<complexType name="ArrayOfImage">
   <sequence>
      <element maxOccurs="unbounded" name="image" type="xsd:hexBinary"/>
   </sequence>
</complexType>

データは次の方法でロードされます。enclosureType は JAX-WS RI によって生成されます ( JAX-WS RI 2.1.7-b01-)。

final List<byte[]> imgData = new LinkedList<byte[]>();
for (final Iterator<File> iterator = files.iterator(); iterator.hasNext(); ) {
   imgData.add(Files.toByteArray(iterator.next())); //Files class from Guava release 13
}
enclosingType.setArrayOfImage(imgData);

画像がリモート Web サービスに送信されると、次のようなエラーが発生します。

javax.xml.ws.soap.SOAPFaultException: org.xml.sax.SAXParseException: An invalid XML character (Unicode: 0x0) was found in the element content of the document. Message being parsed: HEXHEXHEXHEXHEXHEXHEXHEXHEXHEXHEXHEXHEXHEXHEXHEXHEXHEXHEXHEXHEXHEXHEXHEXHEXHEXHEXHEXHEXHEXHEXHEXHEXHEXHEXHEXHEXHEXHEXHEXHEXHEXHEXH</ns4:image></ns4:arrayOfImage><ns4:otherField></ns4:otherField></ns4:enclosingType></ns5:enclosingTypes></ns5:outerEnclosingType></S:Body></S:Envelope>

TIFF に Unicode バイトを含めることは完全に可能だと思います。これは、この回答NULLに基づいて送信されているものだと思います。

私が理解しているように、hexBinary は Base64 でエンコードされたデータを想定していないため、生成された API を正しく使用しています。画像を正しく送信するために他に何かする必要がありますか?

4

1 に答える 1

1

これは、開発者を混乱させるエラー メッセージの良い例でした。

この例外の原因となるバイナリ ファイルの null バイトに問題はありませんでしたString。null バイトは通常の型のフィールドにありましたが、例外は何らかの理由でこれを示しませんでした。

これは、テスト ケースで を生成byte[]し、SOAP オブジェクトを XML にシリアル化することでテストできました。エラーはスローされませんでした。ただし、null バイトを「通常の」フィールドの文字列に配置すると、エラーが発生しました。

文字列は、私が制御できないデータベースから取得されます。したがって、SOAP オブジェクトに「設定」される前に、すべての文字列から null バイトを削除する文字列クリーニング コードを追加しました。

于 2015-04-02T11:34:32.287 に答える