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.

Friday, May 31, 2013

Errores comunes en Clientes de Webservices generados con Axis

Generar un cliente para consumir un servicio, debería de ser tan fácil como generarlo.. consumirlo... me funciona y ya.
Pero a todos los que nos ha tocado, consumir servicios, nos hemos dado cuenta que no siempre es así. Se nos pueden generar muchos problemas, que muchas veces son muy sencillos de solucionar, y en los que nos ha tocado googlear por largas horas y a prueba y error logramos resolver. Aquí van algunos de esos problemas y como resolverlos:

  1. The message must be an instance of: {http://www.w3.org/2003/05/soap-envelope}Envelope

    Este error lo que nos indica es que la versión de soap que se está usando es distinta, o sea que debemos cambiarlo a la 1.2
    Solución:
    Luego que crean los métodos en su provider, y en el método que consumen deben de agregar lo siguiente en el serviceStub que se les generó:
    Cuando se realiza el Envelope, en el parámetro que se le pasa al getFactory:
           env = toEnvelope(getFactory(_operationClient.getOptions().getSoapVersionURI())
    sustituir el_operationClient.getOptions().getSoapVersionURI() por http://www.w3.org/2003/05/soap-envelope
    Con esto ya se actualiza la versión.

  2. The MessageContext does not have an associated SOAPFault.

    Este error lo que nos indica es que el contexto no tiene un fault asociado, es decir que el servicio está devolviendo un error y el cliente que se nos generó espera que el error venga en un fault; sin embargo el servicio no devuelve un fault.
    Solución:
    En el serviceStub que genero nuestro cliente hay una opción que setea si se devuelve o no un fault, esta se encuentra antes de crear el messageContext, antes del envelope:
           _operationClient.getOptions().setExceptionToBeThrownOnSOAPFault(true);
    Esta debe setearse en false para que ni genere fault, o si nuestro error es al revés, debemos setearla en true.


  3. Nuestro Servicio no tiene Seguridad

    Normalmente los servicios que consumimos tendrán un usuario y password; sin embargo si nos entregan uno sin seguridad.
    Solución:
    No utilizar el rampart que normalmente usamos y comentar esta linea:
             sc.engageModule("rampart");

    Además dentro del serviceStub que se nos generó debemos agregar después de realizar el envelope, del método toEnvelope, estas líneas:
        String url = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
        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();
                      headerBlock.setRole("http://www.w3.org/2003/05/soapenvelope/role/next");

    Estas lo que hacen es agregar un header de seguridad que necesita el servicio para que funcione correctamente.

1 comment:

  1. Muchas gracias El punto 2 me acaba de solucionar media vida!!!

    ReplyDelete