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

时间:2015-03-26 14:37:11

标签: web-services jax-ws saxparseexception

我正在尝试将TIFF图像发送到Web服务,该服务以下列方式接受图像(当然这只是一个更大的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);

当图像发送到远程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字节,我假设它是根据this answer发送的内容。

据我了解,我正在使用生成的API,因为hexBinary不期望Base64编码数据。是否有其他事情需要做才能使图像正确发送?

1 个答案:

答案 0 :(得分:1)

这是错误信息的一个很好的例子,让开发人员失去了气味。

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

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

字符串来自一个我无法控制的数据库 - 因此我添加了一些字符串清理代码,它会在所有字符串中删除空字节,然后再将它们设置为&#39;在SOAP对象中。