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).
Esta dependencia proporciona las siguientes funcionalidades:
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:
Para trabajar con SOAP además de la librería spring-boot-starter-web-services necesitaremos este 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:
Y así es cómo lo utilizaremos:
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.
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
Publicar un comentario