viernes, 12 de junio de 2009

Glassfish: " Error al cargar los descriptores de implementación para el módulo..."

El escenario es el siguiente:
Tienes un módulo EJB que consume un WebService, ya sea desde otro proyecto local o desde un WSDL externo al proyecto. Y tienes una aplicación web que utiliza el módulo EJB. Cuando despliegas el EJB, no hay problemas, pero cuando despliegas el módulo web, no sale nada y lanza un error:

 wsdl file META-INF/wsdl/client/......wsdl does not exist for service-ref...

Dirás (como yo dije) "pero si compila!!!".. y pensarás "y si consumo el WS dentro del modulo web?". y te negarás porque eso rompería el esquema que pensabas...

bueno... alguien también le pasó y también encontró la solución.

Nada más hay que revisar el código que crea NetBeans en el EJB cuando consume un WebService:

@WebServiceRef(wsdlLocation = "META-INF/wsdl/client/ProductsList/localhost_8084/ProductsListService/ProductsList.wsdl")
private ProductsListService service;

El EJB lo consume normalemente, porque el WSDL está dentro del mismo proyecto EJB. Cuando es llamado desde el módulo Web, el EJB buscará el wsdl desde donde fue llamado, y como el módulo web no tiene ese archivo, manda el error que mencioné.

Solución:
La más pesada: poner el EJB y el web dentro de un Enterprise Application.

La más técnica: Copiar el archivo .wsdl dentro de la carpeta del web, y cambiar la referencia (wsdlLocation) a esa nueva ubicación.

La más práctica:
En el EJB que consume el WebService, cambiar el valor de wsdlLocation y colocar el URL del WSDL público.

@WebServiceRef(wsdlLocation = "http://localhost:8084/ProductsListService/ProductsList.wsdl")
private ProductsListService service;

Obviamente, el URL debe ser el del WSDL real que estas consumiendo. Yo usé este para poder ilustrar el ejemplo.

La más elegante: Usar algún ESB, pero eso será tema de otro post.