2013-08-09 22 views
5

私が知りたいのは、MTOM/XOP SOAPレスポンスを解析する簡単な方法があることです。 問題は、単純なHTTPを使用してSOAPメッセージとjavax.xmlを送信して応答を解析することです。しかし、いくつかのサービスはmulipart /関連で私に応答し、それを解析するためにはるかに複雑なロジックが必要です(パフォーマンスの問題)。 MTOM/XOP SOAPレスポンスを解析するためにapache cxf、apache axiom、その他のライブラリをどうにか利用することができますか?Javaを使用してXOP/MTOM SOAP応答を解析する方法は?

+0

を解決しましたか? –

答えて

6

These unit testsは、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=\"<[email protected]>\"; " 
       + "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'); 
} 

は、ctはレスポンスのコンテンツタイプヘッダから来ます。 "mimedata"が応答の内容になります。 (また、MTOMの要求を作成する)

+0

私は同じようにしました。ちょうど共有する時間がありません。ご回答ありがとうございます! –

+0

Daniel様、 質問に関連するコンテンツタイプについて教えてください。http://stackoverflow.com/questions/37455584/manually-parse-mtom-message –

3

CXF、標準javax.mail.internet.MimeMultipartクラスを使用する必要はありませんが仕事をして、それは非常に使いやすいです。

ここで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); 
} 
1

私は同じ問題を持っていたし、あなたが答えを見つけるか@Nicolasアルバート通り

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; 
} 
関連する問題