0

我正在开发基于 CXF 的 web 服务。其中一个请求是客户端应该能够上传可选的 PDF 文件作为消息的一部分。这很简单:

我已将它与 getter 和 setter 添加到我的传输对象中:

@XmlMimeType("application/octet-stream")
@XmlElement(name = "InvoicePdf", required = false)
private DataHandler invoicePdf = null;

我还启用了对 MTOM 的支持:

Endpoint endpoint = Endpoint.publish("/myWs", new WsImpl(getServletContext()));
SOAPBinding binding = (SOAPBinding) endpoint.getBinding();
binding.setMTOMEnabled(true);

以及用法:

DataHandler pdf2 = p_invoice.getInvoicePdf();
//pdf2.getInputStream();
//pdf2.writeTo(outputstream);

一切都很好。我能够接收和处理文件。但是,可能存在客户端不上传文件的情况,因为它是可选的。问题是即使客户端没有发送文件,我也无法注意到它。

  • pdf2 不为空
  • pdf2.getInputStream() 不为空
  • pdf2.getInputStream() 包含一些数据。我想跳过解析输入流并寻找 PDF 签名。因为将输入流转发到所需的输出流(写入文件)要容易得多
  • 我在 DataHandler 或 DataSource (pdf2.getDataSource() ) API 中没有找到任何合适的方法或字段来确定文件是否存在。我在调试中看到空的 DataHandler 包含长度为 9 的 DataSource,这比正确的 PDF 文件要少得多。不幸的是,长度属性根本无法访问。

知道如何确定文件是否已发送吗?

4

1 回答 1

0

解决方案是在 SOAP 消息中跳过此附件的 xml 标记。所以我的错误是发送空标签:

<InvoicePdf></InvoicePdf>

然后你会得到有问题的行为描述。但是,如果您完全跳过此标记,则 DataHandel 为空,因此我能够区分文件是否已发送。

于 2013-08-21T08:10:26.450 回答