0

CXF に基づいて Web サービスを開発しています。要求の 1 つは、クライアントがオプションの PDF ファイルをメッセージの一部としてアップロードできるようにすることです。これはかなり些細なことでした:

これをゲッターとセッターで転送オブジェクトに追加しました:

@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() は null ではありません
  • pdf2.getInputStream() にはいくつかのデータが含まれています。入力ストリームの解析と PDF 署名の検索をスキップしたいと思います。入力ストリームを目的の出力ストリームに転送する方がはるかに簡単であるため (ファイルへの書き込み)
  • DataHandler または DataSource (pdf2.getDataSource() ) API で、ファイルの存在を判断するための適切なメソッドまたはフィールドが見つかりませんでした。デバッグで、空の DataHandler に長さが 9 の DataSource が含まれていることがわかります。これは、正しい PDF ファイルよりもはるかに少ない値です。残念ながら、長さのプロパティにはまったくアクセスできません。

ファイルが送信されたかどうかを判断する方法はありますか?

4

1 に答える 1

0

解決策は、SOAP メッセージでこの添付ファイルの xml タグをスキップすることです。だから私の間違いは空のタグを送信していました:

<InvoicePdf></InvoicePdf>

次に、問題で説明されている動作を取得します。ただし、このタグを完全にスキップすると、DataHandel は null になるため、ファイルが送信されたかどうかを区別できます。

于 2013-08-21T08:10:26.450 に答える