Как читать данные из сообщения SOAP с большим вложением XOP, используя Spring WS и Axiom
Я пытаюсь создать веб-сервис, который будет принимать большие файлы и сохранять их с именем, указанным в сообщении SOAP. Вот пример сообщения запроса
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sch="http://mywebservice.com.ua/bait/schemas" xmlns:xm="http://www.w3.org/2005/05/xmlmime">
<soapenv:Header/>
<soapenv:Body>
<sch:SubmitProjectFileRequest>
<sch:ProjectName>MyADProject.xml</sch:ProjectName>
<sch:ProjectFile xm:contentType="text/text">cid:710420383131</sch:ProjectFile>
</sch:SubmitProjectFileRequest>
</soapenv:Body>
</soapenv:Envelope>
Я уже кое-что создал: я могу получать большие XOP-файлы без OutOfMemoryError. Проблема в том, что я не могу получить доступ к узлу ProjectName запроса, так как любые попытки получить его приводят к встраиванию вложения в запрос. И это само по себе приводит к OutOfMemoryError
Вот код, который я сейчас использую для этой цели
@PayloadRoot(localPart = SUBMIT_PROJECT_FILE_REQUEST, namespace = NAMESPACE_URI)
public void handleSubmitProjectFileRequest(SoapMessage message) throws Exception {
String projectName = getProjectName(message.getDocument());
Attachment attachment = message.getAttachments().next();
projectFileService.storeProjectFile(projectName, attachment.getDataHandler());
}
private String getProjectName(Document xml) throws XPathExpressionException {
String prefix = xml.lookupPrefix(NAMESPACE_URI);
NodeList names = xml.getElementsByTagName(String.format("%s:%s", prefix, "ProjectName"));
String projectName = names.item(0).getTextContent();
return projectName;
}
Может ли кто-нибудь помочь мне извлечь как большое вложение XOP, так и содержимое узла ProjectName, используя Spring WS и Axiom?
заранее спасибо
1 ответ
Из того, что я прочитал (извините, я мог опубликовать только 2 ссылки):
- http://www.java.net/node/690763
- markmail.org/message/utd5ineljlvvugse
И по детальному определению метода MTOM:
- www.crosschecknet.com/intro_to_mtom.php
Несмотря на то, что данные оптимизированы для транспорта, данные, закодированные в base64, которые вы прикрепляете к своему сообщению, все равно будут распакованы и помещены обратно в мыльное сообщение перед основным обработчиком (например, SOAPHandler
например) овладевает им. Это кажется ограничением этой методологии.
Использование технологий, о которых вы упомянули, ставит вас на правильный путь для решения (по сравнению с теми из нас, кто был вынужден использовать основные SOAPMessage
а также SOAPHandlers
). Если вы используете некоторые из специализированных объектов в AXIOM и Spring, вы сможете это сделать. Проверьте эту статью здесь: http://forum.springsource.org/archive/index.php/t-48343.html
Спасибо KK