Básicamente quiero crear un cliente de servicios web para enviar un mensaje de error de mtom a través del método de proxy. He creado bien mis artefactos de servicio desde el servicio web wsdl. El mensaje se crea correctamente, sin embargo, cuando habilito mtom y agrego un archivo adjunto, el archivo adjunto siempre se envía en línea y no en una parte mime separada. Está habilitado como mtom pero, por alguna razón, decide no optimizar el mensaje y, por lo tanto, lo envía en línea. Ejecutar el mismo código a través de soapui da el resultado correcto, así que sé que el servicio lo aceptará.JAX-WS siempre envía adjuntos MTOM en línea
Aquí está mi código básico para crear una solicitud de jabón y enviarla. Habilito mtomfeature pero también he intentado hacerlo con soapBinding.setMTOMEnabled(true);
Para ambos métodos lo he depurado con ((SOAPBinding) binding).isMTOMEnabled()
para verificar que esté configurado para ser habilitado.
// initiate services....
// create service and enable mtom
WebServiceBlah service = new WebServiceBlah(new URL(wsdlURL), SERVICE_NAME);
WebServiceBlahPort port = service.getWebServiceBlahPort(new MTOMFeature(true, 3072));
// load file
File file = new File("/home/mypdf.pdf");
FileInputStream fileinputstream = new FileInputStream(file);
int numberBytes = fileinputstream.available();
byte bytearray[] = new byte[numberBytes];
fileinputstream.read(bytearray);
fileinputstream.close();
// create uploadResult
UploadResult request = new UploadResult();
// create attachment
AttachmentType attachment = new AttachmentType();
attachment.setContentType("application/doc");
attachment.setValue(bytearray);
// create result and add attachment to it
RenderedResult result = new RenderedResult();
result.setResult(attachment);
result.setResultContentType("pdf");
result.setResultName("a pdf file");
// add result to request
request.getResult().add(result);
// send request
port.UploadResults(request);
Lo que obtengo es que mi archivo adjunto se envía en línea como se ve a continuación. (Capturado con wireshark)
POST /blah/ws/ HTTP/1.1
Content-type: multipart/related;start="<rootpart*[email protected]>";type="application/xop+xml";boundary="uuid:15c3ee3b-60c7-4726-a52c-8080965e4536";start-info="text/xml"
Soapaction: ""
Accept: text/xml, multipart/related, text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
User-Agent: JAX-WS RI 2.1.6 in JDK 6
Host: 123.123.123.123
Connection: keep-alive
Content-Length: 12372
--uuid:15c3ee3b-60c7-4726-a52c-8080965e4536
Content-Id: <rootpart*[email protected]>
Content-Type: application/xop+xml;charset=utf-8;type="text/xml"
Content-Transfer-Encoding: binary
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Header></S:Header>
<S:Body>
<ns2:uploadResult xmlns:xmime="http://www.w3.org/2005/05/xmlmime">
<renderedResult>
<result xmime:contentType="application/doc">JVBERi0xLjQKJaqrrK0KNCAwIG9iago8</result>
<resultContentType>pdf</resultContentType>
<resultName>a pdf file</resultName>
</renderedResult>
</ns2:uploadResult>
</S:Body>
</S:Envelope>
--uuid:15c3ee3b-60c7-4726-a52c-8080965e4536
Lo que quiero es para la fijación en la etiqueta resultado ser reemplazado con la etiqueta en línea y el archivo adjunto añade al mensaje de jabón en una parte mime diferente. por ejemplo
<result xmime:contentType='application/doc'>
<inc:Include href="cid:myid3" xmlns:inc='http://www.w3.org/2004/08/xop/include'/>
</result>
Y entonces la siguiente añade al mensaje de jabón
------=_Part_10_28027205.1314348995670
Content-Type: application/pdf
Content-Transfer-Encoding: binary
Content-ID: cid:myid3
Content-Disposition: attachment; name="mypdf.pdf"
JVBERi0xLjQKJaqrrK0KNCAwIG9iago8
¿Has resuelto esto? Tengo exactamente el mismo problema. La documentación de JAX-WS también dice esto: 'Según lo definido por la especificación JAXB 2.0 xs: base64Binary y xs: la asignación de hexBinary a java es byte []. La implementación de JAX-WS ha establecido un umbral de 1 KB de tamaño de byte []. Este umbral se puede modificar utilizando la propiedad específica de implementación com.sun.xml.ws.developer.JAXWSProperties.MTOM_THRESHOLD_VALUE en RequestContext en el lado del cliente y en MessageContext en el lado del servidor. Está estableciendo el umbral en 3072 en su código anterior. Establecer esto a 0,1, ... parece no hacer diferencia. – SteveJ