Generar clases java a partir de un wsdl con maven y cxf
Vamos a ver aquí como generar con maven y CXF las clases java necesarias para generar un web service, tanto cliente como servidor, a partir de un wsdl y los xsd necesarios.
Primero creamos nuestro proyecto maven normalito, como un jar. El comando a utilizar puede ser este
mvn archetype:create -DgroupId=com.chuidiang.ejemplos -DartifactId=EjemploWsdl2JavaCXF
Esto nos creará un directorio EjemploWsdl2JavaCXF y dentro de el la estructura de directorios y ficheros de nuestro proyecto java/maven.
Creamos manualmente, por ejemplo, un directorio src/main/wsdl donde situamos los ficheros wsdl y xsd que queramos.
Ahora editamos el pom.xml para poner las dependencias y la llamada al plugin wsdl2java de cxf que será el encargado de generar las clases java, tanto cliente como servidor, de esos wsdl. En el pom.xml tenemos que poner algo como esto
<build> <plugins> <plugin> <groupId>org.apache.cxf</groupId> <artifactId>cxf-codegen-plugin</artifactId> <version>2.4.2</version> <executions> <execution> <id>generate-sources</id> <phase>generate-sources</phase> <configuration> <sourceRoot>${basedir}/src/main/java</sourceRoot> <wsdlOptions> <wsdlOption> <wsdl>${basedir}/src/main/wsdl/UnWebService.wsdl</wsdl> </wsdlOption> <wsdlOption><wsdl>${basedir}/src/main/wsdl/OtroWebService.wsdl</wsdl> </wsdlOption> </wsdlOptions> </configuration> <goals> <goal>wsdl2java</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
Hemos puesto en <sourceRoot> dónde queremos que nos deje los fuentes y a base de <wsdlOptions> y <wsdl> los ficheros .wsdl de los que queremos extraer las clases. Ahora sólo nos queda ejecutar un mvn install o similar para que se generen dichas clases.
Entre otras, se generarán
- UnWebServiceImpl que será la interfaz que debemos implementar en el servidor, con las anotaciones @WebService y @WebMethod correspondientes.
- UnWebServiceService que será la clase que debemos usar para el cliente.
Por ejemplo, para el servidor
@WebService public class UnWebService implements UnWebServiceImpl { .... }
y para publicar el web service
import javax.xml.ws.Endpoint; .... Endpoint.publish( "http://localhost:8080/UnWebService", new UnWebService());
mientras que para el cliente usaremos
UnWebServiceService cliente = new UnWebServiceService( new URL("http://localhost:8080/UnWebService?wsdl")); UnWebServiceImpl servicio = cliente.getUnWebServicePort(); ... // Y ya podemos llamar al web service. Object unResultado = service.unMetodoDelWebService(losParametrosQueSean);