En la entrada anterior se compartió el código para generar un servicio Axis2 el cual debía ser desplegado en el AS y expuesto con seguridad UserNameToken y también el código para un cliente Axis2.
En esta entrada usaremos el mismo servicio conla misma seguridad pero el cliente será implementado usando JAX-WS con CXF.
Veamos primero las partes más interesantes del código.
La conexión HTTP se define de la misma manera:
Luego se crea un objeto service y a partir de este se optiene un puerto, concepto similar al del stub en Axis2.
Ambas clases son generadas una vez ejecutado el comando maven: mvn clean compile
Por último accedemos a las propiedades del puerto recién creado y especificamos un nuevo endpoint. En este caso en particular no es necesario pues el WSDL usando tiene bien definido el endpoint, pero en aquellos caso en que el endpoint del WSDL no sea el correcto si debe realizarse este ajuste.
Luego de este fragmento de código el consumo del servicio es similar a si no tuviera seguridad asociada.
Llegado a este punto no vemos por ningún lado ni la política de seguridad ni el user/pass ni nada que indique que estaremos usando UserNameToken y es que esta parte se realiza a nivel de configuración de algunos ficheros. Veamos cuales.
Primero para que se generen correctamente las clases a partir del WSDL se usa este fichero jaxb-bindings.xml
De no incluir el generateElementProperty=”false” veríamos como los atributos String tendrían un tipo JAXB asociado.
El otro fichero importante es cxf.xml que cuando está presente es cargado por el framework automáticamente, siempre que incluyamos la dependencia a “spring-context” en nuestro pom.xml
Aquí se definen 2 beans, el último apunta a una clase que se encarga de darnos la contraseña a utilizar dado un usuario en particular, mientras que el primer bean nos permite definir el usuario y la clase a utilizar para cargar la contraseña.
Llegados a este punto ya se aprecia como se determina la generación de las clases y como se setea el usuario y la contraseña, pero viene faltando la política y es que la política viene incluída en el WSDL usado para generar las clases y se referencia a nivel de binding como pueden ver en la línea marcada de azul.
Con estos elementos en su lugar pueden darle al proyecto un mvn clean compile y se generarán las clases necesarias en target/generated-sources/cxf las cuales son necesarias para que el código implementado funcione. Un ejemplo de la salida por consola de este código es el siguiente:
Sin más les dejo el enlace al repo en github para el proyecto maven.
Espero les sea de utilidad.
Cliente JAX-WS con CXF para consumir servicios con seguridad UT.