Para hacer un cliente SOAP en Spring Boot, en primer lugar tendremos que añadir la siguiente dependencia a nuestro pom.xml:
<!-- Dependencia Spring WS --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web-services</artifactId> </dependency> |
Podemos añadir, también en el pom.xml, el siguiente plugin para generar las clases necesarias para el cliente automáticamente, a partir de un archivo .wsdl, que lo situaremos en la ruta /src/main/resources/xsd. La ruta de nuestro .wsdl la tendremos que poner en el bloque <schemaDirectory>, y el nombre del archivo en <include>. Si queremos generar las clases a partir de varios .wsdl, debemos poner tener un bloque <execution> por cada archivo. Además, podemos definir el paquete de nuestro proyecto en el que se generarán las clases, especificándolo en el campo <generatePackage>:
<!-- SOAP -->
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<version>0.14.0</version>
<executions>
<execution>
<id>Fopum</id>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<args>
<arg>-XautoNameResolution</arg>
</args>
<schemaLanguage>WSDL</schemaLanguage>
<generateDirectory>${project.basedir}/src/main/java</generateDirectory>
<generatePackage>es.um.atica.bajamatricula.soap.fopum</generatePackage>
<schemaDirectory>${project.basedir}/src/main/resources/xsd</schemaDirectory>
<schemaIncludes>
<include>ServicioFopumTest.wsdl</include>
</schemaIncludes>
</configuration>
</execution>
<execution>
<id>ArchivoUMU</id>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<args>
<arg>-XautoNameResolution</arg>
</args>
<schemaLanguage>WSDL</schemaLanguage>
<generateDirectory>${project.basedir}/src/main/java</generateDirectory>
<generatePackage>es.um.atica.bajamatricula.soap.archivo</generatePackage>
<schemaDirectory>${project.basedir}/src/main/resources/xsd</schemaDirectory>
<schemaIncludes>
<include>ServicioArchivoUMU (1).xml</include>
</schemaIncludes>
</configuration>
</execution>
</executions>
</plugin> |
Lo normal es que al añadir el plugin al pom.xml y guardarlo, se ejecute automáticamente el plugin y se generen las clases, pero si no es así, podemos hacer un Maven Build (Click derecho en el proyecto → Run As → Maven Build) para hacer que se ejectue.
Una vez generadas las clases necesarias por el plugin, tendremos que hacer el cliente:
package com.servicios.soap.client;
import javax.xml.bind.JAXBElement;
import org.springframework.ws.client.core.support.WebServiceGatewaySupport;
import com.servicios.soap.model.ObjectFactory;
import com.servicios.soap.model.ProductosVentaRequestType;
import com.servicios.soap.model.ProductosVentaResponseType;
public class MarketSoapClient extends WebServiceGatewaySupport {
public ProductosVentaResponseType obtenerTodosProductos() {
ObjectFactory of = new ObjectFactory();
JAXBElement<ProductosVentaRequestType> request = of.createProductosTodosRequest(new ProductosVentaRequestType());
JAXBElement<ProductosVentaResponseType> response = (JAXBElement<ProductosVentaResponseType>) getWebServiceTemplate()
.marshalSendAndReceive(request);
return response.getValue();
}
} |
Por último, tendremos que añadir la siguiente clase para la configuración del cliente:
package com.servicios.soap.configuracion;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.oxm.jaxb.Jaxb2Marshaller;
import com.servicios.soap.client.MarketSoapClient;
@Configuration
public class ClientesSoapConfiguracion {
/**
* Bean necesario para que el cliente haga la transformacion JAXB
*
* @return
*/
@Bean
public Jaxb2Marshaller marshaller() {
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
// El nombre del paquete debe ser donde esten las clases Java generadas con JAXB
marshaller.setContextPath("com.servicios.soap.model");
return marshaller;
}
/**
* Damos de alta el cliente soap
*
* @param marshaller
* @return
*/
@Bean
public MarketSoapClient marketSoapClient(Jaxb2Marshaller marshaller) {
MarketSoapClient client = new MarketSoapClient();
// Indicar la uri del servicio
client.setDefaultUri("http://localhost:8080/soap");
client.setMarshaller(marshaller);
client.setUnmarshaller(marshaller);
return client;
}
} |
Aquí tendremos que modificar la uri de nuestro servicio. Esto lo haremos en la línea de client.setDefaultUri( ... ), y podemos obtener dicha uri en el archivo que hemos utilizado para generar las clases necesarias, en la propiedad location del bloque <soap address />, por ejemplo:
<soap:address location="http://serviciosumupruebas.um.es:80/serviciosumu/services/ServicioUmu"/> |
Además, también tendremos que especificar el paquete en el que se encuentran las clases generadas, en la instrucción marshaller.setContextPath( ... ).