Как читать данные из сообщения 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?

заранее спасибо


person edio    schedule 01.08.2011    source источник


Ответы (1)


Из того, что я прочитал (извините, смог опубликовать только 2 ссылки):

И по подробному определению метода MTOM:

  • www.crosschecknet.com/intro_to_mtom.php

Несмотря на то, что они оптимизированы для транспорта, данные в кодировке base64, которые вы прикрепляете к своему сообщению, по-прежнему будут неупорядочены и помещены обратно в мыльное сообщение до того, как базовый обработчик (например, SOAPHandler) получит их. Это, по-видимому, является ограничением этой методологии.

Использование технологий, которые вы упомянули, направит вас на правильный путь к решению (по сравнению с теми из нас, кто был загнан в угол, используя базовые SOAPMessage и SOAPHandlers). Если вы используете некоторые из специализированных объектов в AXIOM и spring, вы сможете это сделать. Ознакомьтесь с этой статьей здесь: http://forum.springsource.org/archive/index.php/t-48343.html

Спасибо, КК

person alph486    schedule 09.03.2012