如何使用java解析XOP/MTOM SOAP响应?

如何使用java解析XOP/MTOM SOAP响应?,java,soap,cxf,mtom,xop,Java,Soap,Cxf,Mtom,Xop,我只是想知道,是否有任何简单的方法可以解析MTOM/XOP SOAP响应。 问题是,我使用普通HTTP发送soap消息,并使用javax.xml解析响应。但有些服务使用mulipart/related响应我,需要更复杂的逻辑来解析它(性能问题)。 因此,我想知道我是否可以利用apache cxf、apache axiom或任何其他库来解析MTOM/XOP SOAP响应?演示如何使用cxf从MTOM消息中提取附件。我将内联一个测试,以防将来不存在此链接: private MessageImpl m

我只是想知道,是否有任何简单的方法可以解析MTOM/XOP SOAP响应。 问题是,我使用普通HTTP发送soap消息,并使用javax.xml解析响应。但有些服务使用mulipart/related响应我,需要更复杂的逻辑来解析它(性能问题)。 因此,我想知道我是否可以利用apache cxf、apache axiom或任何其他库来解析MTOM/XOP SOAP响应?

演示如何使用cxf从MTOM消息中提取附件。我将内联一个测试,以防将来不存在此链接:

private MessageImpl msg;

@Before
public void setUp() throws Exception {
    msg = new MessageImpl();
    Exchange exchange = new ExchangeImpl();
    msg.setExchange(exchange);
}

@Test
public void testDeserializerMtom() throws Exception {
    InputStream is = getClass().getResourceAsStream("mimedata");
    String ct = "multipart/related; type=\"application/xop+xml\"; "
                + "start=\"<soap.xml@xfire.codehaus.org>\"; "
                + "start-info=\"text/xml; charset=utf-8\"; "
                + "boundary=\"----=_Part_4_701508.1145579811786\"";

    msg.put(Message.CONTENT_TYPE, ct);
    msg.setContent(InputStream.class, is);

    AttachmentDeserializer deserializer = new AttachmentDeserializer(msg);
    deserializer.initializeAttachments();

    InputStream attBody = msg.getContent(InputStream.class);
    assertTrue(attBody != is);
    assertTrue(attBody instanceof DelegatingInputStream);

    Collection<Attachment> atts = msg.getAttachments();
    assertNotNull(atts);

    Iterator<Attachment> itr = atts.iterator();
    assertTrue(itr.hasNext());

    Attachment a = itr.next();
    assertNotNull(a);

    InputStream attIs = a.getDataHandler().getInputStream();

    // check the cached output stream
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    IOUtils.copy(attBody, out);
    assertTrue(out.toString().startsWith("<env:Envelope"));

    // try streaming a character off the wire
    assertTrue(attIs.read() == '/');
    assertTrue(attIs.read() == '9');
}
private MessageImpl msg;
@以前
public void setUp()引发异常{
msg=newmessageimpl();
Exchange=新的ExchangeImpl();
msg.setExchange(交换);
}
@试验
public void testDeserializerMtom()引发异常{
InputStream=getClass().getResourceAsStream(“mimedata”);
String ct=“multipart/related;type=\”应用程序/xop+xml\”
+“开始=\”\“;”
+“开始信息=\”文本/xml;字符集=utf-8\”
+“边界=\”----=“第4部分”U 701508.1145579811786\”;
msg.put(Message.CONTENT\u TYPE,ct);
msg.setContent(InputStream.class,is);
AttachmentDeserializer反序列化程序=新的AttachmentDeserializer(msg);
反序列化程序。initializeAttachments();
InputStream attBody=msg.getContent(InputStream.class);
assertTrue(attBody!=is);
assertTrue(DelegatingInputStream的attBody实例);
集合atts=msg.getAttachments();
资产不为空(atts);
迭代器itr=atts.Iterator();
assertTrue(itr.hasNext());
附件a=itr.next();
资产净值(a);
InputStream attIs=a.getDataHandler().getInputStream();
//检查缓存的输出流
ByteArrayOutputStream out=新建ByteArrayOutputStream();
IOUtils.副本(附件,输出);

assertTrue(out.toString().startsWith(“无需使用CXF),标准的javax.mail.internet.MimeMultipart类完成了这项工作,并且非常易于使用(还可以创建MTOM请求)

这里是一个非常简单的示例,用于解码MTOM响应的一部分:

MimeMultipart mp = new MimeMultipart(new ByteArrayDataSource(data, contentType));
int count = mp.getCount();
for (int i = 0; i < count; i++) {
    BodyPart bp = mp.getBodyPart(i);
    bp.saveFile(filepath + "_" + i);
}
MimeMultipart mp=new MimeMultipart(new ByteArrayDataSource(data,contentType));
int count=mp.getCount();
for(int i=0;i
我和@Nicolas Albert有着同样的问题并得到了解决

public byte[] mimeParser(InputStream isMtm) {
    ByteArrayOutputStream baos = null;
    try {
        MimeMultipart mp = new MimeMultipart(new ByteArrayDataSource(isMtm,
                ct));
        int count = mp.getCount();
        baos = new ByteArrayOutputStream();
        for (int i = 0; i < count; i++) {
            BodyPart bodyPart = mp.getBodyPart(i);
            if (!Part.ATTACHMENT
                    .equalsIgnoreCase(bodyPart.getDisposition())
                    && !StringUtils.isNotBlank(bodyPart.getFileName())) {
                continue; // dealing with attachments only
            }
            bodyPart.writeTo(baos);
        }

        byte[] attachment = baos.toByteArray();
        FileUtils.writeByteArrayToFile(new File("E:/wss/attachment.zip"), attachment);
        return attachment;
    } catch (Exception ex) {
        ex.printStackTrace();
    } finally {
        if (baos != null) {
            try {
                baos.close();
            } catch (Exception ex) {

            }
        }
    }
    return null;
}
public byte[]mimeParser(InputStream isMtm){
ByteArrayOutputStream baos=null;
试一试{
MimeMultipart mp=新的MimeMultipart(新的ByteArrayDataSource(isMtm,
ct);
int count=mp.getCount();
bas=新的ByteArrayOutputStream();
for(int i=0;i
你找到答案了吗?我也是这么做的。只是没有时间分享。谢谢你的回答!亲爱的丹尼尔,你能告诉我与问题相关的内容类型吗
ct
ByteArrayDataSource()
中是什么吗?该内容类型应该来自哪里?