Я разрабатываю веб-сервис на основе 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 вообще недоступно.
Любая идея, как определить, был ли отправлен файл или нет?