Invocación de un servicio web SOAP en Spring

1. Información general

Anteriormente, vimos cómo crear un servicio web SOAP con Spring.

En este tutorial, aprenderemos cómo crear un cliente basado en Spring para consumir este servicio web .

Al invocar un servicio web SOAP en Java, hicimos lo mismo con JAX-WS RI.

2. El servicio web Spring SOAP: un resumen rápido

Anteriormente, habíamos creado un servicio web en Spring para obtener los datos de un país, dado su nombre. Antes de profundizar en la implementación del cliente, hagamos un resumen rápido de cómo lo hicimos.

Siguiendo el enfoque de contrato primero, primero escribimos un archivo de esquema XML que define el dominio. Luego usamos este XSD para generar clases para la solicitud, respuesta y modelo de datos usando el complemento jaxb2-maven-plugin .

Después de eso, codificamos cuatro clases:

  • CountryEndpoint : el punto final que responde a la solicitud
  • CountryRepository : el repositorio en el backend para proporcionar datos del país
  • WebServiceConfig : la configuración que define los beans necesarios
  • Aplicación : la aplicación Spring Boot para que nuestro servicio esté disponible para el consumo

Finalmente, lo probamos a través de cURL enviando una solicitud SOAP.

Ahora iniciemos el servidor ejecutando la aplicación de arranque anterior y pasemos al siguiente paso.

3. El cliente

Aquí, vamos a crear un cliente Spring para invocar y probar el servicio web anterior .

Ahora, veamos paso a paso todo lo que necesitamos hacer para crear un cliente.

3.1. Generar código de cliente

Primero, generaremos algunas clases usando el WSDL disponible en //localhost:8080/ws/countries.wsdl. Descargaremos y guardaremos esto en nuestra carpeta src / main / resources .

Para generar código usando Maven, agregaremos el complemento maven-jaxb2-plugin a nuestro pom.xml :

 org.jvnet.jaxb2.maven2 maven-jaxb2-plugin 0.14.0    generate     WSDL ${project.basedir}/src/main/java com.baeldung.springsoap.client.gen ${project.basedir}/src/main/resources  countries.wsdl   

Cabe destacar que en la configuración del complemento definimos:

  • generateDirectory : la carpeta donde se guardarán los artefactos generados
  • generatePackage : el nombre del paquete que usarán los artefactos
  • schemaDirectory y schemaIncludes : el directorio y el nombre de archivo del WSDL

Para llevar a cabo el proceso de generación de JAXB, ejecutaremos este complemento simplemente construyendo el proyecto:

mvn compile

Curiosamente, los artefactos generados aquí son los mismos que los generados para el servicio.

Enumeremos los que usaremos:

  • Country.java y Currency.java : POJO que representan el modelo de datos
  • GetCountryRequest.java : el tipo de solicitud
  • GetCountryResponse.java : el tipo de respuesta

El servicio podría implementarse en cualquier parte del mundo, y solo con su WSDL, pudimos generar las mismas clases en el extremo del cliente que en el servidor.

3.2. PaísCliente

A continuación, necesitamos extender WebServiceGatewaySupport de Spring para interactuar con el servicio web.

Llamaremos a esta clase CountryClient :

public class CountryClient extends WebServiceGatewaySupport { public GetCountryResponse getCountry(String country) { GetCountryRequest request = new GetCountryRequest(); request.setName(country); GetCountryResponse response = (GetCountryResponse) getWebServiceTemplate() .marshalSendAndReceive(request); return response; } }

Aquí, definimos un único método getCountry , correspondiente a la operación que había expuesto el servicio web. En el método, creamos una instancia de GetCountryRequest e invocamos el servicio web para obtener una GetCountryResponse . En otras palabras, aquí es donde realizamos el intercambio SOAP .

Como podemos ver, Spring hizo que la invocación fuera bastante sencilla con su WebServiceTemplate . Usamos el método marshalSendAndReceive de la plantilla para realizar el intercambio SOAP.

Las conversiones XML se manejan aquí a través de un Marshaller enchufado .

Ahora veamos la configuración de donde viene este Marshaller .

3.3. CountryClientConfig

Todo lo que necesitamos para configurar nuestro cliente Spring WS son dos beans.

Primero, un Jaxb2Marshaller para convertir mensajes hacia y desde XML, y segundo, nuestro CountryClient , que conectará el bean marshaller :

@Configuration public class CountryClientConfig { @Bean public Jaxb2Marshaller marshaller() { Jaxb2Marshaller marshaller = new Jaxb2Marshaller(); marshaller.setContextPath("com.baeldung.springsoap.client.gen"); return marshaller; } @Bean public CountryClient countryClient(Jaxb2Marshaller marshaller) { CountryClient client = new CountryClient(); client.setDefaultUri("//localhost:8080/ws"); client.setMarshaller(marshaller); client.setUnmarshaller(marshaller); return client; } } 

Aquí, debemos tener cuidado de que la ruta de contexto del marshaller sea ​​la misma que generatePackage especificado en la configuración del complemento de nuestro pom.xml .

Observe también el URI predeterminado para el cliente aquí. Se establece como la ubicación de la dirección soap: especificada en el WSDL.

4. Prueba del cliente

A continuación, escribiremos una prueba JUnit para verificar que nuestro cliente esté funcionando como se esperaba:

@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = CountryClientConfig.class, loader = AnnotationConfigContextLoader.class) public class ClientLiveTest { @Autowired CountryClient client; @Test public void givenCountryService_whenCountryPoland_thenCapitalIsWarsaw() { GetCountryResponse response = client.getCountry("Poland"); assertEquals("Warsaw", response.getCountry().getCapital()); } @Test public void givenCountryService_whenCountrySpain_thenCurrencyEUR() { GetCountryResponse response = client.getCountry("Spain"); assertEquals(Currency.EUR, response.getCountry().getCurrency()); } } 

Como podemos ver, conectamos el bean CountryClient definido en nuestro CountryClientConfig . Luego, usamos su getCountry para invocar el servicio remoto como se describió anteriormente.

Además, pudimos extraer la información que necesitábamos para nuestras afirmaciones utilizando los modelos de datos generados POJO, País y Moneda .

5. Conclusión

En este tutorial, vimos los conceptos básicos de cómo invocar un servicio web SOAP usando Spring WS .

Simplemente hemos arañado la superficie de lo que Spring tiene para ofrecer en el área de servicios web SOAP; hay mucho que explorar.

Como siempre, el código fuente está disponible en GitHub.