uso titledborder poner layouts crear con borde java soap cxf mtom xop

poner - titledborder java



Cómo analizar la respuesta SOOP XOP/MTOM usando java? (3)

Solo quiero saber si hay alguna forma sencilla de analizar la respuesta SOAP de MTOM / XOP. El problema es que utilizo HTTP simple para enviar mensajes de jabón y javax.xml para analizar la respuesta. Pero algunos servicios me responden con mulipart / related y requiere una lógica mucho más compleja para analizarlo (el rendimiento importa). Entonces, me pregunto si de alguna manera puedo aprovechar apache cxf, apache axiom o cualquier otra biblioteca para analizar la respuesta SOAP de MTOM / XOP.


No es necesario usar CXF , la clase estándar javax.mail.internet.MimeMultipart hace el trabajo y es muy fácil de usar (también para crear una solicitud MTOM).

Aquí una muestra muy simple para decodificar partes de una respuesta 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); }


Tuve el mismo problema y lo resolví como @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; }


Estas pruebas unitarias le muestran cómo usar CXF para extraer archivos adjuntos de un mensaje MTOM. Voy a alinear una de las pruebas en caso de que este enlace no exista en el futuro:

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

En su caso, el ct vendrá del encabezado de tipo de contenido de la respuesta. El "mimedata" será el contenido de la respuesta.