使用 hexBinary 数据类型将二进制文件发送到 Web 服务时出现 SAXParseException

SAXParseException while sending binary to web service using hexBinary datatype

我正在尝试将 TIFF 图像发送到网络服务,该网络服务以下列方式接受图像(当然,这只是一个更大的 WSDL 的片段):

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

数据加载方式如下,其中enclosingType由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);

当图片被发送到远程网络服务时,我得到以下样式的错误:

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 字节,我假设这是基于 this answer.

发送的内容

据我所知,我正确地使用了生成的 API,因为 hexBinary 不需要 Base64 编码数据。是否需要执行其他操作才能正确发送图像?

这是一个很好的例子,错误消息让开发人员失去了嗅觉。

二进制文件中的空字节从来没有导致此异常的问题 - 空字节在正常的 String 类型的字段中,但由于某种原因异常没有显示这一点。

我们能够通过在测试用例中生成 byte[] 并将 SOAP 对象序列化为 XML 来对此进行测试。没有抛出错误。但是,将空字节放入 'normal' 字段中的字符串确实会导致错误。

字符串来自我无法控制的数据库 - 因此我添加了一些字符串清理代码,这些代码在所有字符串 'set' 进入 SOAP 对象之前从所有字符串中删除空字节。