Spring WS - Guía rápida
Spring Web Services (Spring-WS) es uno de los proyectos desarrollados por Spring Community. Su principal objetivo es crear servicios web basados en documentos. El proyecto Spring Web Services facilita el contrato primeroSOAP Service Development, proporciona múltiples formas de crear servicios web flexibles, que pueden manipular cargas útiles XML de múltiples formas.
Los servicios web de Spring utilizan conceptos de Spring como la inyección de dependencias y las configuraciones sin problemas. Spring-WS requiere la versión Spring 3.0. Con el desarrollo de contrato primero, comenzamos conWSDL Contract y luego usará JAVA para implementar el contrato requerido.
A diferencia del enfoque del último contrato, donde las interfaces JAVA generan contratos WSDL / XSD. El contrato basado en WSDL sigue siendo independiente de la implementación de JAVA en el enfoque de contrato primero. En caso de que necesitemos cambiar las interfaces JAVA, entonces no es necesario comunicar los cambios realizados en el contrato WSDL existente a los usuarios de servicios web. Spring-WS tiene como objetivo proporcionar un acoplamiento flexible entre el contrato WSDL y su implementación basada en JAVA.
Caracteristicas
Las siguientes son las características de Spring Web Services:
XML Mapping to Objects - Las solicitudes basadas en XML se pueden asignar a cualquier objeto utilizando la información almacenada en la carga útil del mensaje, el encabezado de acción SOAP o utilizando una expresión XPath.
Multiple API Support to parse XML - Además de las API JAXP estándar (DOM, SAX, StAX) para analizar las solicitudes XML entrantes, también se admiten otras bibliotecas como JDOM, dom4j, XOM.
Multiple API Support to marshal XML- Spring Web Services es compatible con las bibliotecas JAXB 1 y 2, Castor, XMLBeans, JiBX y XStream mediante su módulo de asignación de objetos / XML. El módulo Object / XML Mapping también se puede utilizar en código de servicios no web.
Spring based configurations - Spring Web Services utiliza Spring Application Contexts para sus configuraciones que tienen una arquitectura similar a la de Spring Web MVC.
Integrated WS-Security module - Con el módulo WS-Security, puede firmar, cifrar, descifrar mensajes SOAP o autenticarlos.
Support for Acegi Security - Usando la implementación de WS-Security de Spring Web Services, la configuración de Acegi puede usarse para sus servicios SOAP.
Arquitectura
El proyecto Spring-WS consta de cinco módulos principales, que se explican a continuación.
Spring-WS Core - Es el módulo principal y proporciona las interfaces centrales como WebServiceMessage y SoapMessage, el marco del lado del servidor, una potente capacidad de envío de mensajes y clases de soporte para implementar puntos finales de servicios web. También proporciona un cliente consumidor de servicios web comoWebServiceTemplate.
Spring-WS Support - Este módulo proporciona soporte para JMS, correos electrónicos, etc.
Spring-WS Security- Este módulo es responsable de proporcionar la implementación de WS-Security integrada con el módulo de servicio web principal. Con este módulo, podemos agregar tokens principales, firmar, cifrar y descifrar mensajes SOAP. Este módulo permite utilizar la implementación de seguridad de Spring existente para la autenticación y autorización.
Spring XML- Este módulo proporciona clases de soporte XML para Spring Web Services. Este módulo es utilizado internamente por Spring-WS framework.
Spring OXM - Este módulo proporciona clases de soporte para XML vs Object Mapping.
En este capítulo, entenderemos el proceso de configuración de Spring-WS en sistemas basados en Windows y Linux. El Spring-WS se puede instalar e integrar fácilmente con suJava environment y MAVENsiguiendo unos sencillos pasos sin complejos procedimientos de configuración. Se requiere la administración de usuarios durante la instalación.
Requisitos del sistema
La siguiente tabla enumera los requisitos del sistema, mientras que los pasos siguientes nos guiarán a través del procedimiento de configuración del entorno.
JDK | Java SE 2 JDK 1.5 o superior |
Memoria | 1 GB de RAM (recomendado) |
Espacio del disco | Sin requisito mínimo |
Versión del sistema operativo | Windows XP o superior, Linux |
Procedamos ahora con los pasos para instalar Spring-WS.
Paso 1: verificar la instalación de Java
Para empezar, debe tener instalado el Kit de desarrollo de software (SDK) de Java en su sistema. Para verificar esto, ejecute cualquiera de los siguientes dos comandos dependiendo de la plataforma en la que esté trabajando.
Si la instalación de Java se ha realizado correctamente, mostrará la versión actual y la especificación de su instalación de Java. En la siguiente tabla se proporciona un resultado de muestra.
Plataforma | Mando | Salida de muestra |
---|---|---|
Ventanas | Abra la consola de comandos y escriba - \> java -version |
Versión de Java "1.7.0_60" Entorno de tiempo de ejecución Java (TM) SE (compilación 1.7.0_60-b19) VM de servidor Java Hotspot (TM) de 64 bits (compilación 24.60-b09, modo mixto) |
Linux | Abra el terminal de comando y escriba - $ java -version |
versión de Java "1.7.0_25" Entorno de tiempo de ejecución abierto de JDK (rhel-2.3.10.4.el6_4-x86_64) Abra la máquina virtual del servidor JDK de 64 bits (compilación 23.7-b01, modo mixto) |
Suponemos que los lectores de este tutorial tienen la versión 1.7.0_60 de Java SDK instalada en su sistema.
En caso de que no tenga Java SDK, descargue su versión actual desde https://www.oracle.com/technetwork/java/javase/downloads/index.html y tenerlo instalado.
Paso 2: configura tu entorno Java
Establecer la variable de entorno JAVA_HOME para apuntar a la ubicación del directorio base donde está instalado Java en su máquina.
S.No. | Plataforma y descripción |
---|---|
1 | Windows Establezca JAVA_HOME en C: \ ProgramFiles \ java \ jdk1.7.0_60 |
2 | Linux Exportar JAVA_HOME = / usr / local / java-current |
Agregue la ruta completa de la ubicación del compilador de Java a la ruta del sistema.
S.No. | Plataforma y descripción |
---|---|
1 | Windows Agregue la cadena "C: \ Archivos de programa \ Java \ jdk1.7.0_60 \ bin" al final de la variable de sistema PATH. |
2 | Linux Exportar RUTA = $ RUTA: $ JAVA_HOME / bin / |
Ejecuta el comando java -version desde el símbolo del sistema como se explicó anteriormente.
Paso 3: descarga el archivo de Maven
Descarga Maven 3.3.3 desde https://maven.apache.org/download.cgi
SO | Nombre de archivo |
---|---|
Ventanas | apache-maven-3.3.3-bin.zip |
Linux | apache-maven-3.3.3-bin.tar.gz |
Mac | apache-maven-3.3.3-bin.tar.gz |
Paso 4: extraiga el archivo de Maven
Extraiga el archivo en el directorio en el que desea instalar Maven 3.3.3. El subdirectorio apache-maven-3.3.3 se creará a partir del archivo.
SO | Ubicación (puede ser diferente según su instalación) |
---|---|
Ventanas | C: \ Archivos de programa \ Apache Software Foundation \ apache-maven-3.3.3 |
Linux | / usr / local / apache-maven |
Mac | / usr / local / apache-maven |
Paso 5: establecer variables de entorno de Maven
Agregue M2_HOME, M2 y MAVEN_OPTS a las variables de entorno.
SO | Salida |
---|---|
Ventanas | Establezca las variables de entorno mediante las propiedades del sistema. M2_HOME = C: \ Archivos de programa \ Apache Software Foundation \ apache-maven-3.3.3 M2 =% M2_HOME% \ bin MAVEN_OPTS = -Xms256m -Xmx512m |
Linux | Abra el terminal de comando y configure las variables de entorno. exportar M2_HOME = / usr / local / apache-maven / apache-maven-3.3.3 exportar M2 = $ M2_HOME / bin exportar MAVEN_OPTS = -Xms256m -Xmx512m |
Mac | Abra el terminal de comando y configure las variables de entorno. exportar M2_HOME = / usr / local / apache-maven / apache-maven-3.3.3 exportar M2 = $ M2_HOME / bin exportar MAVEN_OPTS = -Xms256m -Xmx512m |
Paso 6: agregue la ubicación del directorio bin de Maven a la ruta del sistema
Ahora agregue la variable M2 a la ruta del sistema.
SO | Salida |
---|---|
Ventanas | Agregue la cadena;% M2% al final de la variable de sistema, Ruta. |
Linux | export PATH = $ M2: $ PATH |
Mac | export PATH = $ M2: $ PATH |
Paso 7: verificar la instalación de Maven
Ahora abre la consola, ejecuta lo siguiente mvn mando.
SO | Tarea | Mando |
---|---|---|
Ventanas | Abrir consola de comandos | c: \> mvn --version |
Linux | Terminal de comando abierto | $ mvn --version |
Mac | Terminal abierta | máquina: <joseph $ mvn --version |
Finalmente, verifique la salida de los comandos anteriores, que debería ser algo como se muestra a continuación:
SO | Salida |
---|---|
Ventanas | Apache Maven 3.3.3 (7994120775791599e205a5524ec3e0dfe41d4a06; 2015-04-22T17: 27: 37 + 05: 30) Inicio de Maven: C: \ Archivos de programa \ Apache Software Foundation \ apache-maven-3.3.3 Versión de Java: 1.7.0_75, proveedor: Oracle Corporation Inicio de Java: C: \ Archivos de programa \ Java \ jdk1.7.0_75 \ jre Configuración regional predeterminada: en_US, codificación de plataforma: Cp1252 |
Linux | Apache Maven 3.3.3 (7994120775791599e205a5524ec3e0dfe41d4a06; 2015-04-22T17: 27: 37 + 05: 30) Hogar de Maven: /usr/local/apache-maven/apache-maven-3.3.3 Versión de Java: 1.7.0_75, proveedor: Oracle Corporation Inicio de Java: /usr/local/java-current/jdk1.7.0_75/jre |
Mac | Apache Maven 3.3.3 (7994120775791599e205a5524ec3e0dfe41d4a06; 2015-04-22T17: 27: 37 + 05: 30) Hogar de Maven: /usr/local/apache-maven/apache-maven-3.3.3 Versión de Java: 1.7.0_75, proveedor: Oracle Corporation Inicio de Java: /Library/Java/Home/jdk1.7.0_75/jre |
Paso 8: Configurar Eclipse IDE
Todos los ejemplos de este tutorial se han escrito utilizando el IDE de Eclipse. Se recomienda que los lectores tengan instalada la última versión de Eclipse en su máquina. Para instalar el IDE de Eclipse, descargue los binarios de Eclipse más recientes desde el siguiente enlacehttps://www.eclipse.org/downloads/. Una vez descargada la instalación, descomprima la distribución binaria en una ubicación conveniente.
Por ejemplo en C:\eclipse en ventanas, o /usr/local/eclipseen Linux / Unix y finalmente configure la variable PATH apropiadamente. Eclipse se puede iniciar ejecutando los siguientes comandos en la máquina con Windows, o simplemente puede hacer doble clic en eclipse.exe.
%C:\eclipse\eclipse.exe
Eclipse se puede iniciar ejecutando los siguientes comandos en la máquina UNIX (Solaris, Linux, etc.):
$/usr/local/eclipse/eclipse
Después de un inicio exitoso, si todo está bien, debería mostrar la siguiente pantalla:
Paso 9: configurar Apache Tomcat
Podemos descargar la última versión de Tomcat desde https://tomcat.apache.org/. Una vez descargada la instalación, descomprima la distribución binaria en una ubicación conveniente. Por ejemplo en elC:\apache-tomcat-7.0.59 en una máquina con Windows, o en el /usr/local/apache-tomcat-7.0.59 en una máquina Linux / Unix y luego configure el CATALINA_HOME variable de entorno que apunta a las ubicaciones de instalación.
Tomcat se puede iniciar ejecutando los siguientes comandos en una máquina con Windows, o simplemente puede hacer doble clic en startup.bat
%CATALINA_HOME%\bin\startup.bat
or
C:\apache-tomcat-7.0.59\bin\startup.bat
Tomcat se puede iniciar ejecutando los siguientes comandos en una máquina UNIX (Solaris, Linux, etc.):
$CATALINA_HOME/bin/startup.sh
or
/usr/local/apache-tomcat-7.0.59/bin/startup.sh
Después de un inicio exitoso, las aplicaciones web predeterminadas incluidas con Tomcat estarán disponibles visitando: http://localhost:8080/. Si todo está bien, entonces debería mostrar la siguiente pantalla:
Puede encontrar más información sobre la configuración y ejecución de Tomcat en la documentación incluida aquí, así como en el sitio web de Tomcat: https://tomcat.apache.org
Tomcat se puede detener ejecutando los siguientes comandos en una máquina con Windows:
%CATALINA_HOME%\bin\shutdown
or
C:\apache-tomcat-7.0.59\bin\shutdown
Tomcat se puede detener ejecutando los siguientes comandos en la máquina UNIX (Solaris, Linux, etc.):
$CATALINA_HOME/bin/shutdown.sh
or
/usr/local/apache-tomcat-7.0.59/bin/shutdown.sh
Una vez que hayamos terminado con este último paso, estamos listos para continuar con el primer ejemplo de servicios web, que discutiremos en el próximo capítulo.
Comencemos a escribir un servicio web basado en SOAP real con Spring-WS Framework. Antes de comenzar a escribir nuestro primer ejemplo utilizando el marco Spring-WS, tenemos que asegurarnos de que el entorno Spring-WS esté configurado correctamente como se explica en el capítulo Spring Web Services - Configuración del entorno . Suponemos que los lectores tienen algunos conocimientos básicos de trabajo con el IDE de Eclipse.
Por lo tanto, procedamos a escribir una aplicación Spring WS simple que expondrá un método de servicio web para reservar una licencia en un portal de recursos humanos.
Enfoque de contrato primero
Spring-WS utiliza el enfoque Contract-first, lo que significa que deberíamos tener nuestro XML Structureslisto antes de escribir cualquier código de implementación basado en JAVA. Estamos definiendo un objeto LeaveRequest, que tiene subobjetos: Leave y Employee.
A continuación se muestran las construcciones XML necesarias:
Leave.xml
<Leave xmlns = "http://tutorialspoint.com/hr/schemas">
<StartDate>2016-07-03</StartDate>
<EndDate>2016-07-07</EndDate>
</Leave>
Employee.xml
<Employee xmlns = "http://tutorialspoint.com/hr/schemas">
<Number>404</Number>
<FirstName>Mahesh</FirstName>
<LastName>Parashar</LastName>
</Employee>
LeaveRequest.xml
<LeaveRequest xmlns = "http://tutorialspoint.com/hr/schemas">
<Leave>
<StartDate>2016-07-03</StartDate>
<EndDate>2016-07-07</EndDate>
</Leave>
<Employee>
<Number>404</Number>
<FirstName>Mahesh</FirstName>
<LastName>Parashar</LastName>
</Employee>
</LeaveRequest>
hr.xsd
<xs:schema xmlns:xs = "http://www.w3.org/2001/XMLSchema"
xmlns:hr = "http://tutorialspoint.com/hr/schemas"
elementFormDefault = "qualified"
targetNamespace = "http://tutorialspoint.com/hr/schemas">
<xs:element name = "LeaveRequest">
<xs:complexType>
<xs:all>
<xs:element name = "Leave" type = "hr:LeaveType"/>
<xs:element name = "Employee" type = "hr:EmployeeType"/>
</xs:all>
</xs:complexType>
</xs:element>
<xs:complexType name = "LeaveType">
<xs:sequence>
<xs:element name = "StartDate" type = "xs:date"/>
<xs:element name = "EndDate" type = "xs:date"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name = "EmployeeType">
<xs:sequence>
<xs:element name = "Number" type = "xs:integer"/>
<xs:element name = "FirstName" type = "xs:string"/>
<xs:element name = "LastName" type = "xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
Crea el proyecto
Abramos ahora una consola de comandos, vayamos al directorio C: \ MVN y ejecutemos lo siguiente mvn mando.
C:\MVN>mvn archetype:generate -DarchetypeGroupId = org.springframework.ws
-DarchetypeArtifactId = spring-ws-archetype -DgroupId = com.tutorialspoint.hr
-DartifactId = leaveService
Maven comenzará a procesar y creará la estructura completa del proyecto de la aplicación Java.
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] Using property: groupId = com.tutorialspoint.hr
[INFO] Using property: artifactId = leaveService
Define value for property 'version': 1.0-SNAPSHOT: :
[INFO] Using property: package = com.tutorialspoint.hr
Confirm properties configuration:
groupId: com.tutorialspoint.hr
artifactId: leaveService
version: 1.0-SNAPSHOT
package: com.tutorialspoint.hr
Y: :
[INFO] -------------------------------------------------------------------------
---
[INFO] Using following parameters for creating project from Old (1.x) Archetype:
spring-ws-archetype:2.0.0-M1
[INFO] -------------------------------------------------------------------------
---
[INFO] Parameter: groupId, Value: com.tutorialspoint.hr
[INFO] Parameter: packageName, Value: com.tutorialspoint.hr
[INFO] Parameter: package, Value: com.tutorialspoint.hr
[INFO] Parameter: artifactId, Value: leaveService
[INFO] Parameter: basedir, Value: C:\mvn
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] project created from Old (1.x) Archetype in dir: C:\mvn\leaveService
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 35.989 s
[INFO] Finished at: 2017-01-21T11:18:31+05:30
[INFO] Final Memory: 17M/178M
[INFO] ------------------------------------------------------------------------
Ahora ve a C:/MVNdirectorio. Veremos un proyecto de aplicación Java creado llamadoleaveService(como se especifica en artifactId). Actualice pom.xml y agregue HumanResourceService.java y HumanResourceServiceImpl.java en la carpeta siguiente: C: \ MVN \ leaveService \ src \ main \ java \ com \ tutorialspoint \ hr \ service carpeta. Una vez hecho esto, agregue LeaveEndpoint.java en la siguiente carpeta: carpeta C: \ MVN \ leaveService \ src \ main \ java \ com \ tutorialspoint \ hr \ ws.
pom.xml
<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.tutorialspoint.hr</groupId>
<artifactId>leaveService</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>leaveService Spring-WS Application</name>
<url>http://www.springframework.org/spring-ws</url>
<build>
<finalName>leaveService</finalName>
</build>
<dependencies>
<dependency>
<groupId>org.springframework.ws</groupId>
<artifactId>spring-ws-core</artifactId>
<version>2.4.0.RELEASE</version>
</dependency>
<dependency>
<groupId>jdom</groupId>
<artifactId>jdom</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>wsdl4j</groupId>
<artifactId>wsdl4j</artifactId>
<version>1.6.2</version>
</dependency>
</dependencies>
</project>
HumanResourceService.java
package com.tutorialspoint.hr.service;
import java.util.Date;
public interface HumanResourceService {
void bookLeave(Date startDate, Date endDate, String name);
}
HumanResourceServiceImpl.java
package com.tutorialspoint.hr.service;
import java.util.Date;
import org.springframework.stereotype.Service;
@Service
public class HumanResourceServiceImpl implements HumanResourceService {
public void bookLeave(Date startDate, Date endDate, String name) {
System.out.println("Booking holiday for [" + startDate + "-" + endDate + "]
for [" + name + "] ");
}
}
LeaveEndpoint.java
package com.tutorialspoint.hr.ws;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.ws.server.endpoint.annotation.Endpoint;
import org.springframework.ws.server.endpoint.annotation.PayloadRoot;
import org.springframework.ws.server.endpoint.annotation.RequestPayload;
import com.tutorialspoint.hr.service.HumanResourceService;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.Namespace;
import org.jdom.xpath.XPath;
@Endpoint
public class LeaveEndpoint {
private static final String NAMESPACE_URI = "http://tutorialspoint.com/hr/schemas";
private XPath startDateExpression;
private XPath endDateExpression;
private XPath nameExpression;
private HumanResourceService humanResourceService;
@Autowired
public LeaveEndpoint(HumanResourceService humanResourceService) throws JDOMException {
this.humanResourceService = humanResourceService;
Namespace namespace = Namespace.getNamespace("hr", NAMESPACE_URI);
startDateExpression = XPath.newInstance("//hr:StartDate");
startDateExpression.addNamespace(namespace);
endDateExpression = XPath.newInstance("//hr:EndDate");
endDateExpression.addNamespace(namespace);
nameExpression = XPath.newInstance("concat(//hr:FirstName,' ',//hr:LastName)");
nameExpression.addNamespace(namespace);
}
@PayloadRoot(namespace = NAMESPACE_URI, localPart = "LeaveRequest")
public void handleLeaveRequest(@RequestPayload Element leaveRequest) throws Exception {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date startDate = dateFormat.parse(startDateExpression.valueOf(leaveRequest));
Date endDate = dateFormat.parse(endDateExpression.valueOf(leaveRequest));
String name = nameExpression.valueOf(leaveRequest);
humanResourceService.bookLeave(startDate, endDate, name);
}
}
/WEB-INF/spring-ws-servlet.xml
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns:context = "http://www.springframework.org/schema/context"
xmlns:sws = "http://www.springframework.org/schema/web-services"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/web-services
http://www.springframework.org/schema/web-services/web-services-2.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:component-scan base-package = "com.tutorialspoint.hr"/>
<bean id = "humanResourceService"
class = "com.tutorialspoint.hr.service.HumanResourceServiceImpl" />
<sws:annotation-driven/>
<sws:dynamic-wsdl id = "leave"
portTypeName = "HumanResource"
locationUri = "/leaveService/"
targetNamespace = "http://tutorialspoint.com/hr/definitions">
<sws:xsd location = "/WEB-INF/hr.xsd"/>
</sws:dynamic-wsdl>
</beans>
/WEB-INF/web.xml
<web-app xmlns = "http://java.sun.com/xml/ns/j2ee"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version = "2.4">
<display-name>TutorialsPoint HR Leave Service</display-name>
<servlet>
<servlet-name>spring-ws</servlet-name>
<servlet-class>
org.springframework.ws.transport.http.MessageDispatcherServlet
</servlet-class>
<init-param>
<param-name>transformWsdlLocations</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>spring-ws</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
/WEB-INF/hr.xsd
<xs:schema xmlns:xs = "http://www.w3.org/2001/XMLSchema"
xmlns:hr = "http://tutorialspoint.com/hr/schemas"
elementFormDefault = "qualified"
targetNamespace = "http://tutorialspoint.com/hr/schemas">
<xs:element name = "LeaveRequest">
<xs:complexType>
<xs:all>
<xs:element name = "Leave" type = "hr:LeaveType"/>
<xs:element name = "Employee" type = "hr:EmployeeType"/>
</xs:all>
</xs:complexType>
</xs:element>
<xs:complexType name = "LeaveType">
<xs:sequence>
<xs:element name = "StartDate" type = "xs:date"/>
<xs:element name = "EndDate" type = "xs:date"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name = "EmployeeType">
<xs:sequence>
<xs:element name = "Number" type = "xs:integer"/>
<xs:element name = "FirstName" type = "xs:string"/>
<xs:element name = "LastName" type = "xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
Construye el Proyecto
Vamos a abrir ahora la consola de comandos, ir al directorio C: \ MVN \ leaveService y ejecutar lo siguiente mvn mando.
C:\MVN\leaveService>mvn clean package
Maven comenzará a construir el proyecto.
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building leaveService Spring-WS Application 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ leaveService ---
[INFO] Deleting C:\mvn\leaveService\target
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ leaveServi
ce ---
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources,
i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ leaveService --
-
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding Cp1252, i.e. b
uild is platform dependent!
[INFO] Compiling 3 source files to C:\mvn\leaveService\target\classes
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ le
aveService ---
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources,
i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory C:\mvn\leaveService\src\test\resource
s
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ leaveSe
rvice ---
[INFO] No sources to compile
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ leaveService ---
[INFO] No tests to run.
[INFO]
[INFO] --- maven-war-plugin:2.2:war (default-war) @ leaveService ---
[INFO] Packaging webapp
[INFO] Assembling webapp [leaveService] in [C:\mvn\leaveService\target\leaveServ
ice]
[INFO] Processing war project
[INFO] Copying webapp resources [C:\mvn\leaveService\src\main\webapp]
[INFO] Webapp assembled in [7159 msecs]
[INFO] Building war: C:\mvn\leaveService\target\leaveService.war
[INFO] WEB-INF\web.xml already added, skipping
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 19.667 s
[INFO] Finished at: 2017-01-21T11:56:43+05:30
[INFO] Final Memory: 18M/173M
[INFO] ------------------------------------------------------------------------
Importar proyecto en Eclipse
Siga los pasos que se indican a continuación para importar el proyecto en Eclipse.
Abra Eclipse.
Seleccione File → Import → opción.
Seleccione la opción de proyectos Maven. Haga clic en el botón Siguiente.
Seleccione la ubicación del proyecto, donde leaveService project fue creado usando Maven.
Haga clic en el botón Finalizar.
Ejecutar el proyecto
Una vez que hayamos terminado con la creación de archivos fuente y de configuración, exporte la aplicación. Haga clic con el botón derecho en la aplicación, use la opción Exportar → Archivo WAR y guarde el archivo leaveService.war en la carpeta webapps de Tomcat.
Inicie el servidor Tomcat y asegúrese de que podamos acceder a otras páginas web desde la carpeta webapps utilizando un navegador estándar. Intente acceder a la URL - http: // localhost: 8080 / leaveService / leave.wsdl, si todo está bien con la aplicación web Spring, deberíamos ver la siguiente pantalla.
En el capítulo anterior Spring -WS - Primera aplicación , hemos generado WSDL automáticamente usando la configuración Spring WS. En este caso, mostraremos cómo exponer el WSDL existente utilizando Spring WS.
Paso | Descripción |
---|---|
1 | Cree un proyecto con un nombre leaveService en un paquete com.tutorialspoint como se explica en el capítulo Spring WS - Primera aplicación. |
2 | Cree un leave.wsdl WSDL en la subcarpeta / WEB-INF / wsdl. |
3 | Actualice spring-ws-servlet.xml en la subcarpeta / WEB-INF. Aquí estamos usando la etiqueta static-wsdl en lugar de dynamic-wsdl. |
4 | El paso final es crear el contenido de todos los archivos fuente y de configuración y exportar la aplicación como se explica a continuación. |
/WEB-INF/spring-ws-servlet.xml
<wsdl:definitions xmlns:wsdl = "http://schemas.xmlsoap.org/wsdl/"
xmlns:soap = "http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:schema = "http://tutorialspoint.com/hr/schemas"
xmlns:tns = "http://tutorialspoint.com/hr/definitions"
targetNamespace = "http://tutorialspoint.com/hr/definitions">
<wsdl:types>
<xsd:schema xmlns:xsd = "http://www.w3.org/2001/XMLSchema">
<xsd:import namespace = "http://tutorialspoint.com/hr/schemas"
schemaLocation = "hr.xsd"/>
</xsd:schema>
</wsdl:types>
<wsdl:message name = "LeaveRequest">
<wsdl:part element = "schema:LeaveRequest" name = "LeaveRequest"/>
</wsdl:message>
<wsdl:portType name = "HumanResource">
<wsdl:operation name = "Leave">
<wsdl:input message = "tns:LeaveRequest" name = "LeaveRequest"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name = "HumanResourceBinding" type = "tns:HumanResource">
<soap:binding style = "document"
transport = "http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name = "Leave">
<soap:operation soapAction = "http://mycompany.com/RequestLeave"/>
<wsdl:input name = "LeaveRequest">
<soap:body use = "literal"/>
</wsdl:input>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name = "HumanResourceService">
<wsdl:port binding = "tns:HumanResourceBinding" name = "HumanResourcePort">
<soap:address location = "http://localhost:8080/leaveService/"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
/WEB-INF/spring-ws-servlet.xml
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns:context = "http://www.springframework.org/schema/context"
xmlns:sws = "http://www.springframework.org/schema/web-services"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/web-services
http://www.springframework.org/schema/web-services/web-services-2.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:component-scan base-package = "com.tutorialspoint.hr"/>
<sws:annotation-driven/>
<sws:static-wsdl id = "leave" location = "/WEB-INF/wsdl/leave.wsdl"/>
</beans>
Ejecutar el proyecto
Una vez que hayamos terminado con la creación de archivos fuente y de configuración, deberíamos exportar la aplicación. Haga clic derecho en la aplicación, use la opción Exportar → Archivo WAR y guarde su archivo leaveService.war en la carpeta webapps de Tomcat.
Ahora, inicie el servidor Tomcat y asegúrese de que podamos acceder a otras páginas web desde la carpeta webapps utilizando un navegador estándar. Intente acceder a la URL - http: // localhost: 8080 / leaveService / leave.wsdl, si todo está bien con la aplicación web Spring, veremos la siguiente pantalla.
En este capítulo, entenderemos cómo crear un servidor de aplicaciones web usando Spring WS.
Paso | Descripción |
---|---|
1 | Cree un proyecto con un nombre countryService en un paquete com.tutorialspoint como se explica en el capítulo Spring WS - Primera aplicación. |
2 | Cree countries.xsd, clases de dominio, CountryRepository y CountryEndPoint como se explica en los siguientes pasos. |
3 | Actualice spring-ws-servlet.xml en la subcarpeta / WEB-INF. |
4 | El paso final es crear contenido para todos los archivos fuente y de configuración y exportar la aplicación como se explica a continuación. |
paises.xsd
<xs:schema xmlns:xs = "http://www.w3.org/2001/XMLSchema"
xmlns:tns = "http://tutorialspoint/schemas"
targetNamespace = "http://tutorialspoint/schemas"
elementFormDefault = "qualified">
<xs:element name = "getCountryRequest">
<xs:complexType>
<xs:sequence>
<xs:element name = "name" type = "xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name = "getCountryResponse">
<xs:complexType>
<xs:sequence>
<xs:element name = "country" type = "tns:country"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name = "country">
<xs:sequence>
<xs:element name = "name" type = "xs:string"/>
<xs:element name = "population" type = "xs:int"/>
<xs:element name = "capital" type = "xs:string"/>
<xs:element name = "currency" type = "tns:currency"/>
</xs:sequence>
</xs:complexType>
<xs:simpleType name = "currency">
<xs:restriction base = "xs:string">
<xs:enumeration value = "GBP"/>
<xs:enumeration value = "USD"/>
<xs:enumeration value = "INR"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
Crea el proyecto
Abrimos la consola de comandos, vamos al directorio C: \ MVN y ejecutamos lo siguiente mvn mando.
C:\MVN>mvn archetype:generate -DarchetypeGroupId = org.springframework.ws
-DarchetypeArtifactId = spring-ws-archetype -DgroupId = com.tutorialspoint
-DartifactId = countryService
Maven comenzará a procesar y creará la estructura completa del proyecto de la aplicación Java.
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] Using property: groupId = com.tutorialspoint
[INFO] Using property: artifactId = countryService
Define value for property 'version': 1.0-SNAPSHOT: :
[INFO] Using property: package = com.tutorialspoint
Confirm properties configuration:
groupId: com.tutorialspoint
artifactId: countryService
version: 1.0-SNAPSHOT
package: com.tutorialspoint
Y: :
[INFO] -------------------------------------------------------------------------
---
[INFO] Using following parameters for creating project from Old (1.x) Archetype:
spring-ws-archetype:2.0.0-M1
[INFO] -------------------------------------------------------------------------
---
[INFO] Parameter: groupId, Value: com.tutorialspoint
[INFO] Parameter: packageName, Value: com.tutorialspoint
[INFO] Parameter: package, Value: com.tutorialspoint
[INFO] Parameter: artifactId, Value: countryService
[INFO] Parameter: basedir, Value: C:\mvn
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] project created from Old (1.x) Archetype in dir: C:\mvn\countryService
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 35.989 s
[INFO] Finished at: 2017-01-21T11:18:31+05:30
[INFO] Final Memory: 17M/178M
[INFO] ------------------------------------------------------------------------
Ahora vaya al directorio C: / MVN. Veremos un proyecto de aplicación java creado llamado countryService (como se especifica en artifactId). Actualice pom.xml.
pom.xml
<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.tutorialspoint.hr</groupId>
<artifactId>countryService</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>countryService Spring-WS Application</name>
<url>http://www.springframework.org/spring-ws</url>
<build>
<finalName>countryService</finalName>
</build>
<dependencies>
<dependency>
<groupId>org.springframework.ws</groupId>
<artifactId>spring-ws-core</artifactId>
<version>2.4.0.RELEASE</version>
</dependency>
<dependency>
<groupId>jdom</groupId>
<artifactId>jdom</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>wsdl4j</groupId>
<artifactId>wsdl4j</artifactId>
<version>1.6.2</version>
</dependency>
</dependencies>
</project>
Crear clases de dominio
Copie el archivo countries.xsd en la carpeta C: \ mvn \ countryService \ src \ main \ resources. Abrimos la consola de comandos, vamos al directorio C: \ mvn \ countryService \ src \ main \ resources y ejecutamos lo siguientexjc comando para generar clases de dominio usando countries.xsd.
C:\MVN\countryService\src\main\resources>xjc -p com.tutorialspoint countries.xsd
Maven comenzará a procesar y creará las clases de dominio en el paquete com.tutorialspoint.
parsing a schema...
compiling a schema...
com\tutorialspoint\Country.java
com\tutorialspoint\Currency.java
com\tutorialspoint\GetCountryRequest.java
com\tutorialspoint\GetCountryResponse.java
com\tutorialspoint\ObjectFactory.java
com\tutorialspoint\package-info.java
Cree la carpeta java en C: \ mvn \ countryService \ src \ main folder. Copie todas las clases en la carpeta C: \ mvn \ countryService \ src \ main \ java. Cree CountryRepository y CountryEndPoint para representar la base de datos del país y el servidor del país respectivamente.
CountryRepository.java
package com.tutorialspoint;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.propertyeditors.CurrencyEditor;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;
@Component
public class CountryRepository {
private static final List<Country> countries = new ArrayList<Country>();
public CountryRepository(){
initData();
}
public void initData() {
Country us = new Country();
us.setName("United States");
us.setCapital("Washington");
us.setCurrency(Currency.USD);
us.setPopulation(46704314);
countries.add(us);
Country india = new Country();
india.setName("India");
india.setCapital("New Delhi");
india.setCurrency(Currency.INR);
india.setPopulation(138186860);
countries.add(india);
Country uk = new Country();
uk.setName("United Kingdom");
uk.setCapital("London");
uk.setCurrency(Currency.GBP);
uk.setPopulation(63705000);
countries.add(uk);
}
public Country findCountry(String name) {
Assert.notNull(name);
Country result = null;
for (Country country : countries) {
if (name.trim().equals(country.getName())) {
result = country;
}
}
return result;
}
}
CountryEndPoint.java
package com.tutorialspoint.ws;
import org.jdom.JDOMException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.ws.server.endpoint.annotation.Endpoint;
import org.springframework.ws.server.endpoint.annotation.PayloadRoot;
import org.springframework.ws.server.endpoint.annotation.RequestPayload;
import org.springframework.ws.server.endpoint.annotation.ResponsePayload;
import com.tutorialspoint.Country;
import com.tutorialspoint.CountryRepository;
import com.tutorialspoint.GetCountryRequest;
import com.tutorialspoint.GetCountryResponse;
@Endpoint
public class CountryEndPoint {
private static final String NAMESPACE_URI = "http://tutorialspoint/schemas";
private CountryRepository countryRepository;
@Autowired
public CountryEndPoint(CountryRepository countryRepository) throws JDOMException {
this.countryRepository = countryRepository;
}
@PayloadRoot(namespace = NAMESPACE_URI, localPart = "getCountryRequest")
@ResponsePayload
public GetCountryResponse getCountry(@RequestPayload GetCountryRequest request)
throws JDOMException {
Country country = countryRepository.findCountry(request.getName());
GetCountryResponse response = new GetCountryResponse();
response.setCountry(country);
return response;
}
}
/WEB-INF/spring-ws-servlet.xml
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns:context = "http://www.springframework.org/schema/context"
xmlns:sws = "http://www.springframework.org/schema/web-services"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/web-services
http://www.springframework.org/schema/web-services/web-services-2.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:component-scan base-package = "com.tutorialspoint"/>
<sws:annotation-driven/>
<sws:dynamic-wsdl id="countries"
portTypeName = "CountriesPort"
locationUri = "/countryService/"
targetNamespace = "http://tutorialspoint.com/definitions">
<sws:xsd location = "/WEB-INF/countries.xsd"/>
</sws:dynamic-wsdl>
</beans>
/WEB-INF/web.xml
<web-app xmlns = "http://java.sun.com/xml/ns/j2ee"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version = "2.4">
<display-name>TutorialsPoint Country Service</display-name>
<servlet>
<servlet-name>spring-ws</servlet-name>
<servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet
</servlet-class>
<init-param>
<param-name>transformWsdlLocations</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>spring-ws</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
Construye el Proyecto
Abramos la consola de comandos. Vaya al directorio C: \ MVN \ countryService y ejecute lo siguientemvn mando.
C:\MVN\countryService>mvn clean package
Maven comenzará a construir el proyecto.
INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building countryService Spring-WS Application 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ countryService ---
[INFO] Deleting C:\mvn\countryService\target
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ countrySer
vice ---
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources,
i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ countryService
---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding Cp1252, i.e.
build is platform dependent!
[INFO] Compiling 4 source files to C:\mvn\countryService\target\classes
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ co
untryService ---
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources,
i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory C:\mvn\countryService\src\test\resour
ces
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ country
Service ---
[INFO] No sources to compile
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ countryService ---
[INFO] No tests to run.
[INFO]
[INFO] --- maven-war-plugin:2.2:war (default-war) @ countryService ---
[INFO] Packaging webapp
[INFO] Assembling webapp [countryService] in [C:\mvn\countryService\target\count
ryService]
[INFO] Processing war project
[INFO] Copying webapp resources [C:\mvn\countryService\src\main\webapp]
[INFO] Webapp assembled in [5137 msecs]
[INFO] Building war: C:\mvn\countryService\target\countryService.war
[INFO] WEB-INF\web.xml already added, skipping
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 16.484 s
[INFO] Finished at: 2017-01-28T09:07:59+05:30
[INFO] Final Memory: 19M/170M
[INFO] ------------------------------------------------------------------------
Ejecutar el proyecto
Una vez que hayamos creado los archivos fuente y de configuración, exporte el archivo countryService.war en la carpeta webapps de Tomcat.
Ahora, inicie el servidor Tomcat y asegúrese de que podamos acceder a otras páginas web desde la carpeta webapps utilizando un navegador estándar. Realice una solicitud POST a la URL - http: // localhost: 8080 / countryService / y, utilizando cualquier cliente SOAP, realice la siguiente solicitud.
<x:Envelope xmlns:x = "http://schemas.xmlsoap.org/soap/envelope/"
xmlns:tns = "http://tutorialspoint/schemas">
<x:Header/>
<x:Body>
<tns:getCountryRequest>
<tns:name>United States</tns:name>
</tns:getCountryRequest>
</x:Body>
</x:Envelope>
Verá el siguiente resultado.
<SOAP-ENV:Envelope xmlns:SOAP-ENV = "http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
<ns2:getCountryResponse xmlns:ns2 = "http://tutorialspoint/schemas">
<ns2:country>
<ns2:name>United States</ns2:name>
<ns2:population>46704314</ns2:population>
<ns2:capital>Washington</ns2:capital>
<ns2:currency>USD</ns2:currency>
</ns2:country>
</ns2:getCountryResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
En este capítulo, entenderemos cómo realizar una prueba unitaria de un servicio de aplicación web creado con Spring WS.
Paso | Descripción |
---|---|
1 | Actualice el proyecto countryService creado en el capítulo Spring WS - Write Server. Agregue la carpeta src / test / java. |
2 | Cree CustomerEndPointTest.java en la carpeta - src / test / java / com / tutorialspoint / ws y luego actualice POM.xml como se detalla a continuación. |
3 | Agregue spring-context.xml en la subcarpeta src / main / resources. |
4 | El paso final es crear contenido para todos los archivos fuente y de configuración y probar la aplicación como se explica a continuación. |
POM.xml
<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.tutorialspoint</groupId>
<artifactId>countryService</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>countryService Spring-WS Application</name>
<url>http://www.springframework.org/spring-ws</url>
<build>
<finalName>countryService</finalName>
</build>
<dependencies>
<dependency>
<groupId>org.springframework.ws</groupId>
<artifactId>spring-ws-core</artifactId>
<version>2.4.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>org.springframework.ws</groupId>
<artifactId>spring-ws-test</artifactId>
<version>2.4.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>3.1.2.RELEASE</version>
</dependency>
<dependency>
<groupId>jdom</groupId>
<artifactId>jdom</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>wsdl4j</groupId>
<artifactId>wsdl4j</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.5</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
spring-context.xml
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns:context = "http://www.springframework.org/schema/context"
xmlns:sws = "http://www.springframework.org/schema/web-services"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/web-services
http://www.springframework.org/schema/web-services/web-services-2.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:component-scan base-package = "com.tutorialspoint"/>
<sws:annotation-driven/>
<bean id = "schema" class = "org.springframework.core.io.ClassPathResource">
<constructor-arg index = "0" value = "countries.xsd" />
</bean>
</beans>
CustomerEndPointTest.java
package com.tutorialspoint.ws;
import javax.xml.transform.Source;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.GenericApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.ws.test.server.MockWebServiceClient;
import org.springframework.xml.transform.StringSource;
import static org.springframework.ws.test.server.RequestCreators.withPayload;
import static org.springframework.ws.test.server.ResponseMatchers.payload;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration( locations = "/spring-context.xml" )
public class CustomerEndPointTest {
@Autowired
private ApplicationContext applicationContext;
private MockWebServiceClient mockClient;
@Before
public void createClient() {
mockClient = MockWebServiceClient.createClient(applicationContext);
GenericApplicationContext ctx = (GenericApplicationContext) applicationContext;
final XmlBeanDefinitionReader definitionReader = new XmlBeanDefinitionReader(ctx);
definitionReader.setValidationMode(XmlBeanDefinitionReader.VALIDATION_NONE);
definitionReader.setNamespaceAware(true);
}
@Test
public void testCountryEndpoint() throws Exception {
Source requestPayload = new StringSource(
"<getCountryRequest xmlns = 'http://tutorialspoint/schemas'>"+
"<name>United States</name>"+
"</getCountryRequest>");
Source responsePayload = new StringSource(
"<getCountryResponse xmlns='http://tutorialspoint/schemas'>" +
"<country>" +
"<name>United States</name>"+
"<population>46704314</population>"+
"<capital>Washington</capital>"+
"<currency>USD</currency>"+
"</country>"+
"</getCountryResponse>");
mockClient.sendRequest(withPayload(requestPayload)).andExpect(payload(responsePayload));
}
}
Construye el Proyecto
Abramos la consola de comandos, vayamos al directorio C: \ MVN \ countryService y ejecutemos el siguiente comando mvn.
C:\MVN\countryService>mvn test
Maven comenzará a construir y probar el proyecto.
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building countryService Spring-WS Application 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ countrySer
vice ---
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources,
i.e. build is platform dependent!
[INFO] Copying 2 resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ countryService
---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ co
untryService ---
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources,
i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory C:\MVN\countryService\src\test\resour
ces
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ country
Service ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ countryService ---
[INFO] Surefire report directory: C:\MVN\countryService\target\surefire-reports
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running com.tutorialspoint.ws.CustomerEndPointTest
Feb 27, 2017 11:49:30 AM org.springframework.test.context.TestContextManager ret
rieveTestExecutionListeners
INFO: @TestExecutionListeners is not present for class [class com.tutorialspoint
.ws.CustomerEndPointTest]: using defaults.
Feb 27, 2017 11:49:30 AM org.springframework.beans.factory.xml.XmlBeanDefinition
Reader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [spring-context.xml]
Feb 27, 2017 11:49:30 AM org.springframework.context.support.GenericApplicationC
ontext prepareRefresh
INFO: Refreshing org.springframework.context.support.GenericApplicationContext@b
2eddc0: startup date [Mon Feb 27 11:49:30 IST 2017]; root of context hierarchy
Feb 27, 2017 11:49:31 AM org.springframework.ws.soap.addressing.server.Annotatio
nActionEndpointMapping afterPropertiesSet
INFO: Supporting [WS-Addressing August 2004, WS-Addressing 1.0]
Feb 27, 2017 11:49:31 AM org.springframework.ws.soap.saaj.SaajSoapMessageFactory
afterPropertiesSet
INFO: Creating SAAJ 1.3 MessageFactory with SOAP 1.1 Protocol
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.386 sec
Feb 27, 2017 11:49:31 AM org.springframework.context.support.GenericApplicationC
ontext doClose
INFO: Closing org.springframework.context.support.GenericApplicationContext@b2ed
dc0: startup date [Mon Feb 27 11:49:30 IST 2017]; root of context hierarchy
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.517 s
[INFO] Finished at: 2017-02-27T11:49:31+05:30
[INFO] Final Memory: 11M/109M
[INFO] ------------------------------------------------------------------------
En este capítulo, aprenderemos cómo crear un cliente para el servidor de aplicaciones web creado en Spring WS - Writing Server usando Spring WS.
Paso | Descripción |
---|---|
1 | Actualice el proyecto countryService en el paquete com.tutorialspoint como se explica en el capítulo Spring WS - Writing Server. |
2 | Cree CountryServiceClient.java en el paquete com.tutorialspoint.client y MainApp.java en el paquete com.tutorialspoint como se explica en los siguientes pasos. |
CountryServiceClient.java
package com.tutorialspoint.client;
import org.springframework.ws.client.core.support.WebServiceGatewaySupport;
import com.tutorialspoint.GetCountryRequest;
import com.tutorialspoint.GetCountryResponse;
public class CountryServiceClient extends WebServiceGatewaySupport {
public GetCountryResponse getCountryDetails(String country){
String uri = "http://localhost:8080/countryService/";
GetCountryRequest request = new GetCountryRequest();
request.setName(country);
GetCountryResponse response =(GetCountryResponse) getWebServiceTemplate()
.marshalSendAndReceive(uri, request);
return response;
}
}
MainApp.java
package com.tutorialspoint;
import org.springframework.oxm.jaxb.Jaxb2Marshaller;
import com.tutorialspoint.client.CountryServiceClient;
public class MainApp {
public static void main(String[] args) {
CountryServiceClient client = new CountryServiceClient();
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
marshaller.setContextPath("com.tutorialspoint");
client.setMarshaller(marshaller);
client.setUnmarshaller(marshaller);
GetCountryResponse response = client.getCountryDetails("United States");
System.out.println("Country : " + response.getCountry().getName());
System.out.println("Capital : " + response.getCountry().getCapital());
System.out.println("Population : " + response.getCountry().getPopulation());
System.out.println("Currency : " + response.getCountry().getCurrency());
}
}
Iniciar el servicio web
Inicie el servidor Tomcat y asegúrese de que podamos acceder a otras páginas web desde la carpeta webapps utilizando un navegador estándar.
Probar cliente de servicio web
Haga clic derecho en MainApp.java en su aplicación en Eclipse y use run as Java Applicationmando. Si todo está bien con la aplicación, imprimirá el siguiente mensaje.
Country : United States
Capital : Washington
Population : 46704314
Currency : USD
Aquí, hemos creado un Cliente: CountryServiceClient.javapara el servicio web basado en SOAP. MainApp utiliza CountryServiceClient para realizar un acceso al servicio web, realiza una solicitud de publicación y obtiene los datos.
En este capítulo, aprenderemos cómo realizar una prueba unitaria de un cliente creado en Spring WS - Writing Client para el servidor de aplicaciones web creado en el capítulo Spring WS - Writing Server usando Spring WS.
Paso | Descripción |
---|---|
1 | Actualice el proyecto countryService en el paquete com.tutorialspoint como se explica en el capítulo Spring WS - Writing Server. |
2 | Cree CountryServiceClientTest.java en el paquete com.tutorialspoint en la carpeta SRC → Prueba → Java como se explica en los pasos que se indican a continuación. |
CountryServiceClientTest.java
package com.tutorialspoint;
import static org.junit.Assert.*;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.springframework.oxm.jaxb.Jaxb2Marshaller;
import com.tutorialspoint.client.CountryServiceClient;
public class CountryServiceClientTest {
CountryServiceClient client;
@Before
public void setUp() throws Exception {
client = new CountryServiceClient();
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
marshaller.setContextPath("com.tutorialspoint");
client.setMarshaller(marshaller);
client.setUnmarshaller(marshaller);
}
@Test
public void test() {
GetCountryResponse response = client.getCountryDetails("United States");
Country expectedCountry = new Country();
expectedCountry.setCapital("Washington");
Country actualCountry = response.getCountry();
Assert.assertEquals(expectedCountry.getCapital(), actualCountry.getCapital());
}
}
Iniciar el servicio web
Inicie el servidor Tomcat y asegúrese de que podamos acceder a otras páginas web desde la carpeta webapps utilizando un navegador estándar.
Cliente de servicio web de prueba unitaria
Abramos la consola de comandos, vayamos al directorio C: \ MVN \ countryService y ejecutemos el siguiente comando mvn.
C:\MVN\countryService>mvn test
Maven comenzará a construir y probar el proyecto.
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building countryService Spring-WS Application 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ countrySer
vice ---
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources,
i.e. build is platform dependent!
[INFO] Copying 2 resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ countryService
---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding Cp1252, i.e. b
uild is platform dependent!
[INFO] Compiling 10 source files to C:\MVN\countryService\target\classes
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ co
untryService ---
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources,
i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory C:\MVN\countryService\src\test\resour
ces
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ country
Service ---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding Cp1252, i.e. b
uild is platform dependent!
[INFO] Compiling 2 source files to C:\MVN\countryService\target\test-classes
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ countryService ---
[INFO] Surefire report directory: C:\MVN\countryService\target\surefire-reports
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running com.tutorialspoint.CountryServiceClientTest
Feb 27, 2017 8:45:26 PM org.springframework.ws.soap.saaj.SaajSoapMessageFactory
afterPropertiesSet
INFO: Creating SAAJ 1.3 MessageFactory with SOAP 1.1 Protocol
Feb 27, 2017 8:45:26 PM org.springframework.oxm.jaxb.Jaxb2Marshaller createJaxbC
ontextFromContextPath
INFO: Creating JAXBContext with context path [com.tutorialspoint]
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.457 sec
Running com.tutorialspoint.ws.CustomerEndPointTest
Feb 27, 2017 8:45:27 PM org.springframework.test.context.TestContextManager retr
ieveTestExecutionListeners
INFO: @TestExecutionListeners is not present for class [class com.tutorialspoint
.ws.CustomerEndPointTest]: using defaults.
Feb 27, 2017 8:45:27 PM org.springframework.beans.factory.xml.XmlBeanDefinitionR
eader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [spring-context.xml]
Feb 27, 2017 8:45:27 PM org.springframework.context.support.GenericApplicationCo
ntext prepareRefresh
INFO: Refreshing org.springframework.context.support.GenericApplicationContext@5
17c642: startup date [Mon Feb 27 20:45:27 IST 2017]; root of context hierarchy
Feb 27, 2017 8:45:28 PM org.springframework.ws.soap.addressing.server.Annotation
ActionEndpointMapping afterPropertiesSet
INFO: Supporting [WS-Addressing August 2004, WS-Addressing 1.0]
Feb 27, 2017 8:45:28 PM org.springframework.ws.soap.saaj.SaajSoapMessageFactory
afterPropertiesSet
INFO: Creating SAAJ 1.3 MessageFactory with SOAP 1.1 Protocol
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.243 sec
Feb 27, 2017 8:45:28 PM org.springframework.context.support.GenericApplicationCo
ntext doClose
INFO: Closing org.springframework.context.support.GenericApplicationContext@517c
642: startup date [Mon Feb 27 20:45:27 IST 2017]; root of context hierarchy
Results :
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 5.686 s
[INFO] Finished at: 2017-02-27T20:45:28+05:30
[INFO] Final Memory: 17M/173M
[INFO] ------------------------------------------------------------------------