Versiones comparadas

Clave

  • Se ha añadido esta línea.
  • Se ha eliminado esta línea.
  • El formato se ha cambiado.

Tabla de contenidos

...

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:


Info

Con la configuración actual de las APIs, con el parent fundewebjs-api-parent (ver Creación y estructura de proyecto SpringBootMigración de APIs a Parent FundeWebJS).

No es necesario realizar ninguna configuración de librerías en pom.xml.

Bloque de código
languagexml
<!-- 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, 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>:

Bloque de código
languagexml
			<!-- 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>
						</executions>goals>
						<configuration>
							<args>
								<arg>-XautoNameResolution</arg>
							</args>
							<schemaLanguage>WSDL</schemaLanguage>
							<generateDirectory>${project.basedir}/src/main/java</generateDirectory>
							<generatePackage>es.um.atica.bajamatricula.soap.gen<archivo</generatePackage>
							<schemaDirectory>${project.basedir}/src/main/resources/wsdl<xsd</schemaDirectory>
							<schemaIncludes>
						<include>ServicioFopum.wsdl<		<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 pluginAquí, 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.Página todavía en construcción, referencia principal: Invoking a SOAP web service in Springhacer el cliente:

Bloque de código
languagejava
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:

Bloque de código
languagejava
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:

Bloque de código
<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í:

Bloque de código
languagejava
 	@Bean( name = "marshallerMarket" )
	public Jaxb2Marshaller marshaller() {
		...
	}

	@Bean
	public MarketSoapClient marketSoapClient( @Qualifier( "marshallerMarket" ) Jaxb2Marshaller marshaller) {
		...
	}