如何使用Spring WS和Axiom从具有大型XOP附件的SOAP消息中读取数据

时间:2011-08-01 10:49:33

标签: attachment large-files spring-ws mtom xop

我正在尝试构建一个Web服务,它将接收大文件并使用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>

我已经构建了一些东西:我可以接收没有OutOfMemoryError的大型XOP文件。 问题是我无法访问请求的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;
}

有没有人可以帮我使用Spring WS和Axiom提取大型XOP附件和ProjectName节点内容?

提前致谢

1 个答案:

答案 0 :(得分:1)

从我读到的内容(抱歉只能发布2个链接):

通过MTOM方法的详细定义:

  • www.crosschecknet.com/intro_to_mtom.php

虽然针对传输进行了优化,但是您附加到邮件的base64编码数据仍将被解组并在基本处理程序(例如,像SOAPHandler)得到它之前将其放回soap消息中。这似乎是这种方法的局限。

使用您提到的技术可以使您找到解决问题的正确途径(与那些被迫使用基本SOAPMessageSOAPHandlers的人相比)。如果你使用AXIOM和spring中的一些专用对象,你应该能够做到这一点。在这里查看这篇文章:http://forum.springsource.org/archive/index.php/t-48343.html

谢谢, KK