如何检查MTOM附件是否为空

时间:2013-08-20 13:28:04

标签: web-services jax-ws cxf binary-data mtom

我正在开发基于CXF的webservice。其中一个请求是客户端应该能够将可选的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签名。因为将inputstrem转发到所需的outpustream(写入文件)
  • 要容易得多
  • 我没有在DataHandler或DataSource(pdf2.getDataSource())API中找到用于确定文件存在的任何适当的方法或字段。我在调试中看到空的DataHandler包含长度为9的DataSource,这比正确的PDF文件要少得多。不幸的是,长度属性根本无法访问。

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

1 个答案:

答案 0 :(得分:0)

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

<InvoicePdf></InvoicePdf>

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