Empece este blog para guardar los descubrimientos en programacion que hago cuando tengo un error y por mas que busco en san Google, no encuentro nada hasta despues de horas de andar buscando y horas de prueba y error. Si a alguien algun dia le sirve, que bueno. En general es para mi porque se me olvidan muchos de estos descubrimientos.

Monday, August 27, 2012

Generando Web Service Cliente con Axis 2 en Soap 1.2

Pues la vida al fin habia sido color de rosa en la generacion de web service client en axis2 utilizando el metodo de generacion de cliente desde linea de comando encontrado aqui.

Resulta que los webservices que nos entregan ahora son el Soap 1.2 y estos generaron ciertos problemas.
No soy experta en generacion de web service clients, menos en Soap 1.2, pero he aqui nuestros problemas encontrados y las soluciones a ellos.
Honestamente creo y recomiendo que lo ideal es que generes los clientes utilizando el jax-ws. No tengo conocimientos extensos en este tampoco, pero si se que es mas facil la generacion y consumo de estos. Nosotros desafortunadamente por integracion al proyecto no podemos dejar el Axis y si te encuentras en nuestro mismo barco, espero aqui encuentres ayuda.

La generacion del Cliente se realizo como siempre con la linea de comando y sin necesidad de cambiar nada en el codigo generado.

Primer Error:

org.apache.axis2.AxisFault: BEA-382032: The message must be an instance of: {http://www.w3.org/2003/05/soap-envelope}Envelope
{http://schemas.xmlsoap.org/soap/envelope/}VersionMismatch
<faultcode>soapenv:VersionMismatch</faultcode>

Solucion:
Como el error decia que el problema es que la version que se esta recibiendo el http://schemas.xmlsoap.org/soap/envelope/ y la que esta esperando es http://www.w3.org/2003/05/soap-envelope, se tuvo que poner esta en duro en el stub generado.

La url que debes cambiar no se encuentra tal cual, aparece como _operationClient.getOptions().getSoapVersionURI() en el metodo toEnvelope. Donde encuestres este metodo de toEnvelop cambia el _operationClient.getOptions().getSoapVersionURI() por  "http://www.w3.org/2003/05/soap-envelope".

Segundo Error:
org.apache.axis2.AxisFault: Must Understand check failed for header http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd : Security
{http://www.w3.org/2003/05/soap-envelope}MustUnderstand
Solucion:
Para este investigamos en varias paginas. Un compañero encontro la solucion en la siguiente pagina:
http://msdn.microsoft.com/en-us/library/ms977327.aspx

Para corregir el error en los headers por seguridad se hizo lo siguiente en codigo:
Después de realizar el Envelop (luego del método toEnvelop), deben colocar el siguiente código:

OMNamespace xsi = getFactory(_operationClient.getOptions().getSoapVersionURI()).
createOMNamespace(url, "wsse");

SOAPHeaderBlock soapHeaderBlock =env.getHeader().addHeaderBlock("Security",xsi);                                                  
soapHeaderBlock.setMustUnderstand("1");

Iterator it = env.getHeader().examineAllHeaderBlocks(); while(it.hasNext()) { SOAPHeaderBlock headerBlock= (SOAPHeaderBlock)it.next();


Con estos cambios, todo lo de mas funciono como siempre.

Saludos.