我只想知道,有没有简单的方法来解析MTOM / XOP SOAP响应.
问题是我使用普通HTTP发送soap消息和 javax.xml来解析响应.但是有些服务用mulipart / related响应我,它需要更复杂的逻辑来解析它(性能很重要).
所以我想我可以以某种方式利用apache cxf,apache axiom或任何其他库来解析MTOM / XOP SOAP响应?
问题是我使用普通HTTP发送soap消息和 javax.xml来解析响应.但是有些服务用mulipart / related响应我,它需要更复杂的逻辑来解析它(性能很重要).
所以我想我可以以某种方式利用apache cxf,apache axiom或任何其他库来解析MTOM / XOP SOAP响应?
解决方法
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=\"<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'); }