Integración con un servicio web SOAP

O convertir un XML a una objeto Java. SOAP (Simple Object Access Protocol) es un protocolo estándar que define cómo dos sistemas pueden comunicarse entre si por medio del intercambio de datos XML. Este protocolo deriva de un protocolo llamado XML-RPC.

El paquete Spring Web Services proporciona todas las herramientas para el tratamiento de una comunicación SOAP. Es capaz de interpretar el fichero WSDL (Web Service Description Language - definición de los servicios ofrecidos por el servcio web).

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web-services</artifactId> <version>1.4.0.RELEASE</version> </dependency>
Esta dependencia proporciona las siguientes funcionalidades:
  • Creación y lectura de XML.
  • Mapeo de componentes XML a objetos Java, y viceversa.
  • Liberías para parsear XML.
  • Es Contract-first only, lo que tiene sentido, ya que siempre partiremos del WSDL definido por el servicio web.
Un servicio web SOAP siempre expone su servicio en un dominio del estilo:

https://wwww.example.com/webservicesoap/numconverter.wso?WSDL
Generalmente, para mantener estabilidad en nuestras aplicaciones, este fichero es copiado en la aplicación y utilizado como base para el uso del servicio web. Cualquier actualización en el servicio web deberá ser notificada para poder actualizar el WSDL de nuestro proyecto. Una ubicación aceptable sería:

/src/main/resources/wsdl/
Para trabajar con SOAP además de la librería spring-boot-starter-web-services necesitaremos este plugin:

<plugin> <groupId>org.jvnet.jaxb2.maven2</groupId> <artifactId>maven-jaxb2-plugin</artifactId> <version>0.14.0</version> <executions> <execution> <goals> <goal>generate</goal> </goals> </execution> </executions> <configuration> <schemaDirectory>${project.basedir}/src/main/resources/wsdl</schemaDirectory> <schemaIncludes> <include>*.wsdl</include> </schemaIncludes> </configuration> </plugin>
Este plugin nos permitirá generar clases Java a partir de un WSDL en Maven, a través de JAXB. Para generar los ficheros java debemos ejecutar el comando generate-sources en Maven. Este generará una serie de ficheros bajo /target/generated-sources/xjc.

Una vez se hayan generado los ficheros, ya estamos listos para crear el servicio web cliente simplemente extendiendo la clase WebServiceGatewaySupport e implementando las "operataions" del servicio.

Ejemplo de un cliente utilizando este servicio:

public class NumberClient extends WebServiceGatewaySupport { public NumberToWordsResponse getWords(String numbers) { //publicly accessible SOAP service String uri = "https://www.dataaccess.com/webservicesserver/NumberConversion.wso"; //set the request NumberToWords numberRequest = new NumberToWords(); numberRequest.setUbiNum(new BigInteger(numbers)); //obtain and return the response NumberToWordsResponse response = (NumberToWordsResponse) getWebServiceTemplate().marshalSendAndReceive(uri,numberRequest); return response; } }
Y así es cómo lo utilizaremos:

NumberClient numberClient = new NumberClient(); //create and setup marshaller Jaxb2Marshaller marshaller = new Jaxb2Marshaller(); //provide location to the ObjectFacory marshaller.setContextPath("com.dataaccess.webservicesserver"); //add marshaller to the client numberClient.setMarshaller(marshaller); numberClient.setUnmarshaller(marshaller); //retrieve the word format of the number NumberToWordsResponse response = numberClient.getWords("3454"); //print to screen System.out.println("Response is: " + response.getNumberToWordsResult());

Comentarios

Entradas populares de este blog

Django REST framework

Envío de checkboxes o selector multiple por AJAX con jQuery

Django: relaciones polimórficas