Dependencia pom.xml
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>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
Plugin para generar automáticamente el cliente
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>
Generar clases
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.
Cliente
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();
}
}
Configuración cliente
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( ... ).
Configurar más de un cliente
Si configuramos más de un cliente como hemos explicado, se producirá un conflicto por los Bean y no iniciará la aplicación. Para solucionarlo, en cada clase de configuración de un cliente tendremos que ponerle nombre al bean de Jaxb2Marshaller, y en el método del cliente, etiquetar al marshaller que se pasa como parámetro con @Qualifier con el mismo nombre. Así:
@Bean( name = "marshallerMarket" )
public Jaxb2Marshaller marshaller() {
...
}
@Bean
public MarketSoapClient marketSoapClient( @Qualifier( "marshallerMarket" ) Jaxb2Marshaller marshaller) {
...
}