Как проверить, пусто ли вложение MTOM

Я разрабатываю веб-сервис на основе CXF. Одним из требований является то, что клиент должен иметь возможность загружать необязательный 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() не равен нулю
  • pdf2.getInputStream() содержит некоторые данные. Я хотел бы пропустить синтаксический анализ входного потока и поиск подписи PDF. Поскольку намного проще перенаправить входной поток в желаемый выходной поток (записать в файл)
  • Я не нашел в API DataHandler или DataSource (pdf2.getDataSource()) подходящего метода или поля для определения существования файла. В отладке я вижу, что пустой DataHandler содержит DataSource, длина которого равна 9, что намного меньше, чем правильный файл PDF. К сожалению, свойство length вообще недоступно.

Любая идея, как определить, был ли отправлен файл или нет?


person Aleksander Gralak    schedule 20.08.2013    source источник


Ответы (1)


Решение состоит в том, чтобы пропустить тег xml для этого вложения в сообщении SOAP. Итак, моя ошибка заключалась в отправке пустого тега:

<InvoicePdf></InvoicePdf>

Затем вы получаете поведение, описанное в вопросе. Однако, если вы полностью пропустите этот тег, DataHandel будет нулевым, поэтому я смогу отличить, был ли отправлен файл или нет.

person Aleksander Gralak    schedule 21.08.2013