2016-05-26 136 views
0

我具有低于MTOM响应作为字符串手动解析MTOM消息

--uuid:6b6fab3b-c481-4648-9eb5-8690096eb54d 
Content-Type: application/xop+xml; charset=UTF-8; type="application/soap+xml"; 
Content-Transfer-Encoding: binary 
Content-ID: <[email protected]> 

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"><soap:Body><ns2:receiveDocumentFileResponse xmlns:ns2="http://webservice.edefter.gib.gov.tr/"><return><fileName>GIB-XXXX-201512-KB-000000.zip</fileName><binaryData><xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include" href="cid:[email protected]"/></binaryData></return></ns2:receiveDocumentFileResponse></soap:Body></soap:Envelope> 
--uuid:6b6fab3b-c481-4648-9eb5-8690096eb54d 
Content-Type: application/octet-stream 
Content-Transfer-Encoding: binary 
Content-ID: <[email protected]> 
Content-Disposition: attachment;name="GIB-XXXX-201512-KB-000000.zip" 

/***********MTOM Content****************/ 
--uuid:6b6fab3b-c481-4648-9eb5-8690096eb54d-- 

我使用CXF单元测试代码来解析上述内容关于到xop/mtom parse

附件总是空和执行itr.next(当);行,我得到异常java.lang.IndexOutOfBoundsException:指数:0,大小:0

 InputStream is = null; 
     InputStream attIs = null; 
     try { 
      org.apache.cxf.message.Message cxfMessage = new MessageImpl(); 
      is = new ByteArrayInputStream(response.getBytes("UTF-8")); 
      // FileInputStream fis = new FileInputStream(new File(
      // "D:/wss/gibreturn.txt")); 
      // String ct = "multipart/related; type=\"application/xop+xml\"; " 
      // + "start=\"<[email protected]>\"; " 
      // + "start-info=\"text/xml; charset=utf-8\"; " 
      // + "boundary=\"----=_Part_4_701508.1145579811786\""; 
      cxfMessage.setContent(InputStream.class, is); 
      cxfMessage.put(org.apache.cxf.message.Message.CONTENT_TYPE, 
        "application/xop+xml; charset=UTF-8; type=\"application/soap+xml\";"); 

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

      InputStream attBody = cxfMessage.getContent(InputStream.class); 

      System.out.println(deserializer.toString()); 
      Collection<org.apache.cxf.message.Attachment> atts = cxfMessage 
        .getAttachments(); 
      Iterator<org.apache.cxf.message.Attachment> itr = atts.iterator(); 
      org.apache.cxf.message.Attachment a = itr.next(); 
      attIs = a.getDataHandler().getInputStream(); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      if (is != null) { 
       try { 
        is.close(); 
       } catch (Exception e) { 

       } 
      } 
      if (attIs != null) { 
       try { 
        is.close(); 
       } catch (Exception e) { 

       } 
      } 
     } 

谢谢 亲切的问候

+0

具体的问题可能帮助:你想要发生什么? –

+0

@ Y.B。在mtom消息中有附件,我期望AttachmentDeserializer应该处理附件 –

回答

1

我用手动MIME分析解决它

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; 
}