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> </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. Si queremos generar las clases a partir de diferentes wsdl, debemos ponerlos en diferentes bloque s<execution>:
<!-- 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>ServicioFopumDesa.wsdl</include> -->
<include>ServicioFopumTest.wsdl</include>
<!-- <include>ServicioFopumProd.wsdl</include> -->
<!-- <include>ServicioArchivoUMU.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>
Aquí, tendremos que especificar el campo generatePackage, con el paquete en el que se crearán las clases, schemaDirectory con el directorio donde el plugin buscará los archivos wsdl, que se especificarán dentro de schemaIncludes.
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();
client.setDefaultUri("http://localhost:8080/soap");
client.setMarshaller(marshaller);
client.setUnmarshaller(marshaller);
return client;
}
}