【问题标题】:How to check if MTOM attachment is empty如何检查 MTOM 附件是否为空
【发布时间】:2013-08-20 13:28:04
【问题描述】:

我正在开发基于 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 文件要少得多。不幸的是,长度属性根本无法访问。

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

【问题讨论】:

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


    【解决方案1】:

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

    <InvoicePdf></InvoicePdf>
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-14
      • 2023-02-16
      • 2017-11-15
      • 2020-05-29
      • 2018-04-02
      相关资源
      最近更新 更多