2011-08-26 36 views
10

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 
+3

¿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

Respuesta

1

Un número de cosas puede afectar si adjuntos MTOM son en realidad utilizado.

En el servidor, en primer lugar, es obvio: compruebe que la implementación de su servicio tenga la anotación @MTOM. También puede ajustar el valor de umbral (como SteveJ ya ha mencionado) de esta anotación usando la propiedad threshold().

A veces, los controladores en el servidor pueden interferir con la utilización de los archivos adjuntos MTOM. Cualquier controlador serializa un mensaje SOAP en una cadena o conjunto de bytes (común para la depuración de los manejadores de estilo que escriben el contenido del mensaje en los registros) evitará que se utilicen los archivos adjuntos MTOM. Si es posible, intente deshabilitar su cadena de controladores y ver si los archivos adjuntos MTOM aparecen después de eso.

0

Me he topado con el mismo problema (archivos adjuntos en línea), pero parece que el mensaje SOAP de supervisión es incorrecto (por MessageHandler): se reproduce antes (en el cliente) y después (en el servidor) de MtomCodec.encode(Packet packet, OutputStream out). verdadero mensaje se podía ver en el código de Java en OutputStream out:

com\sun\xml\ws\jaxws-rt\2.2.10\jaxws-rt-2.2.10-sources.jar!\com\sun\xml\ws\encoding\MtomCodec.java

  for(ByteArrayBuffer bos : mtomAttachments){ 
      bos.write(out); 
     } 

funciona igual con new MTOMFeature(true, 3072) en el lado del cliente.

Cuestiones relacionadas