jueves, abril 16, 2009

Error WSWS3047E al consumir un webservice en Rational Web Developer

Relacionado al Post Anterior, estabamos tratando de consumir un webservice desde el Rational Web Developer de IBM.
Cuando consumiamos el webservice desde visual basic o desde el SoapUi, lograbamos consumirlo perfectamente, pero al tratar de consumirlo desde el RWD6 nos daba error.

El problema específico que estabamos teniendo con este webservice es que luego de invocar al mismo, al traer los resultados de la ejecución nos estaba dando este mensaje:


WebServicesFault
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.generalException
faultString: org.xml.sax.SAXException: WSWS3047E: Error: No se puede deserializar el elemento cod_Cuenta del bean dataTransferObject.customerABE.customerDomain.framework.scl.tmmas.com.RegistroComercialDTO.
faultActor: null
faultDetail:

El servicio se ejecutaba, es decir, la llamada fue correcta y se hacian las acciones del servicio. Pero no lograbamos obtener el objeto que trae los resultados obtenidos de la ejecución. El servicio no fue desarrollado por nosotros y no teniamos acceso tampoco a los logs del servidor (del servicio) como para poder identificar el problema. Esto nos hizo perder mucho tiempo en pruebas infructuosas.

Instalamos y probamos el TCPMon para rastrear el problema y encontramos que la respuesta del webservice si se estaba enviando por la red, pero que (como dice el error) no se podía parsear. Cambiamos los wsdl con tipos de datos String asumiendo alguna posible incompatibilidad de tipos entre el servicio y el cliente. No funcionó.

Los servicios fueron desarrollados sobre WebLogic.

Luego de algunas investigaciones, encontramos que al parecer habia cierta información que se enviaba en la respuesta que no era acorde a las especificaciones RFC de XML. Y que esto es lo que estaba dando el problema.

http://www-01.ibm.com/support/docview.wss?uid=swg21220377


Procedimos a cambiar nuevamente el wsdl indicandole la propiedad
elementFormDefault="unqualified" al wsdl y recrear el cliente y apartir de ahi empezamos a consumir correctamente los servicios.

El unqualified es porque el weblogic no genera los namespaces usando las especificaciones RFC al 100% mientras que el websphere sí.


saludos!



1 comentario:

Anónimo dijo...
Este blog ha sido eliminado por un administrador de blog.