viernes, 14 de junio de 2013

WSDL - Contract-first Web Services

Muchas veces queremos a partir de un wsdl generar el WS (server) y respetar la estructura del WSDL
Para esto, tenemos que entender como es el WSDL (estructura), para lo cual compartimos estos links:

http://orangeslate.com/2009/06/15/creating-contract-first-web-services-using-cxf-top-down-approach-part-1-creating-xsds/

http://orangeslate.com/2009/06/15/creating-web-services-using-cxf-contract-first-approach-part-2-wsdl-creation/

http://soa.sys-con.com/node/143909

Importante:

Cuando generamos las clases (utilizando por ejemplo wsdlToJava de CXF o wsimport de la JDK 6) a partir de un WSDL (tecnica conocida como wsdl contract-first), tenemos que dejarlas tal cual están y ademas tenemos que generar la clase que tiene la estructura de la implementacion del servicio respetando todas las anotaciones, incluyendo la de wsdlLocation (ej: serviceImpl.java). En esta anotación (wsdlLocation), vamos a tener que modificar el PATH a absoluto (/wsdl/ejemplo.wsdl) apuntando al wsdl que utilizamos para generar las clases, para que cuando deployemos el WS, este exponga el mismo WSDL que utilizamos para generar las clases.

Por ejemplo, si nuestra implementacion de WS queda sin la anotación targetNameSpace y la interface la tiene apuntando a una URL determinada, nos va a pasar que cuando deployemos el WS, el WSDL generado dinamicamente va a tener un include a otro WSDL a traves del tag wsdl:import. Esto sucede porque la interface del WS y la implememtacion tienen diferentes targetNameSpaces.

Es por esto y otras cosas mas que siempre es conveniente no tocar las clases generadas mediante los comandos wsdlToJava o wsimport.

Otra alternativa es utilzar SOAPUI para generar las clases.