Spring WS - Guia Rápido
Spring Web Services (Spring-WS) é um dos projetos desenvolvidos pela Spring Community. Seu foco principal é criar Web Services orientados a documentos. O projeto Spring Web Services facilita o primeiro contratoSOAP Service Development, fornece várias maneiras de criar serviços da web flexíveis, que podem manipular cargas úteis XML de várias maneiras.
Os serviços da web Spring usam conceitos Spring como injeção de dependência e configurações perfeitamente. O Spring-WS requer a versão Spring 3.0. Com o desenvolvimento do contrato primeiro, começamos comWSDL Contract e então usará JAVA para implementar o contrato necessário.
Ao contrário da abordagem do último contrato, em que as interfaces JAVA geram contrato WSDL / XSD. O contrato baseado em WSDL permanece independente da implementação JAVA na abordagem de primeiro contrato. Caso seja necessário alterar as interfaces JAVA, não há necessidade de comunicar as alterações feitas no contrato WSDL existente aos usuários de serviços da web. Spring-WS visa fornecer acoplamento fraco entre o contrato WSDL e sua implementação baseada em JAVA.
Características
A seguir estão os recursos do Spring Web Services -
XML Mapping to Objects - Solicitações baseadas em XML podem ser mapeadas para qualquer objeto usando as informações armazenadas na carga útil da mensagem, cabeçalho de ação SOAP ou usando uma expressão XPath.
Multiple API Support to parse XML - Além das APIs JAXP padrão (DOM, SAX, StAX) para analisar as solicitações XML de entrada, outras bibliotecas como JDOM, dom4j, XOM também são suportadas.
Multiple API Support to marshal XML- Spring Web Services oferece suporte a bibliotecas JAXB 1 e 2, Castor, XMLBeans, JiBX e XStream usando seu módulo de Mapeamento de Objeto / XML. O módulo Mapeamento de Objeto / XML também pode ser usado em código de serviços não web.
Spring based configurations - Spring Web Services usa os Contextos de Aplicativo Spring para suas configurações, tendo uma arquitetura semelhante à do Spring Web MVC.
Integrated WS-Security module - Usando o módulo WS-Security, você pode assinar, criptografar, descriptografar mensagens SOAP ou autenticá-las.
Support for Acegi Security - Usando a implementação WS-Security de Spring Web Services, a configuração Acegi pode ser usada para seus serviços SOAP.
Arquitetura
O projeto Spring-WS consiste em cinco módulos principais, que são explicados abaixo.
Spring-WS Core - É o módulo principal e fornece as interfaces centrais como WebServiceMessage e SoapMessage, a estrutura do lado do servidor, capacidade poderosa de despacho de mensagens e classes de suporte para implementar pontos de extremidade de serviço da Web. Ele também fornece cliente consumidor de serviço da Web comoWebServiceTemplate.
Spring-WS Support - Este módulo fornece suporte para JMS, e-mails, etc.
Spring-WS Security- Este módulo é responsável por fornecer implementação de WS-Security integrada com o Módulo de Serviço da Web principal. Usando este módulo, podemos adicionar tokens principais, assinar, criptografar e descriptografar mensagens SOAP. Este módulo permite usar a implementação existente do Spring Security para autenticação e autorização.
Spring XML- Este módulo fornece classes de suporte XML para Spring Web Services. Este módulo é usado internamente pela estrutura Spring-WS.
Spring OXM - Este módulo fornece classes de suporte para XML vs Mapeamento de Objetos.
Neste capítulo, entenderemos o processo de configuração do Spring-WS em sistemas baseados em Windows e Linux. O Spring-WS pode ser facilmente instalado e integrado com o seuJava environment e MAVENseguindo alguns passos simples sem quaisquer procedimentos de configuração complexos. A administração do usuário é necessária durante a instalação.
Requisitos de sistema
A tabela a seguir lista os requisitos do sistema, enquanto as etapas subsequentes nos guiarão pelo procedimento de configuração do ambiente.
JDK | Java SE 2 JDK 1.5 ou superior |
Memória | 1 GB de RAM (recomendado) |
Espaço em disco | Sem requisitos mínimos |
Versão do sistema operacional | Windows XP ou superior, Linux |
Vamos agora prosseguir com as etapas para instalar o Spring-WS.
Etapa 1: verificar a instalação do Java
Para começar, você precisa ter o Java Software Development Kit (SDK) instalado em seu sistema. Para verificar isso, execute qualquer um dos dois comandos a seguir, dependendo da plataforma em que está trabalhando.
Se a instalação do Java foi feita corretamente, ele exibirá a versão atual e as especificações de sua instalação do Java. Um exemplo de saída é fornecido na tabela a seguir.
Plataforma | Comando | Saída de amostra |
---|---|---|
janelas | Abra o console de comando e digite - \> versão java |
Versão Java "1.7.0_60" Java (TM) SE Run Time Environment (build 1.7.0_60-b19) Java Hotspot (TM) Servidor VM de 64 bits (versão 24.60-b09, modo misto) |
Linux | Abra o terminal de comando e digite - $ java -version |
versão java "1.7.0_25" Open JDK Runtime Environment (rhel-2.3.10.4.el6_4-x86_64) Abra o servidor VM JDK de 64 bits (compilação 23.7-b01, modo misto) |
Presumimos que os leitores deste tutorial tenham o Java SDK versão 1.7.0_60 instalado em seus sistemas.
Caso você não tenha Java SDK, baixe sua versão atual em https://www.oracle.com/technetwork/java/javase/downloads/index.html e instalá-lo.
Etapa 2: definir seu ambiente Java
Defina a variável de ambiente JAVA_HOME para apontar para o local do diretório base onde o Java está instalado em sua máquina.
S.No. | Plataforma e descrição |
---|---|
1 | Windows Defina JAVA_HOME como C: \ ProgramFiles \ java \ jdk1.7.0_60 |
2 | Linux Exportar JAVA_HOME = / usr / local / java-current |
Anexe o caminho completo do local do compilador Java ao caminho do sistema.
S.No. | Plataforma e descrição |
---|---|
1 | Windows Anexe a string "C: \ Arquivos de programas \ Java \ jdk1.7.0_60 \ bin" ao final da variável de sistema PATH. |
2 | Linux Exportar PATH = $ PATH: $ JAVA_HOME / bin / |
Execute o comando java -version no prompt de comando, conforme explicado acima.
Etapa 3: Baixe o arquivo Maven
Baixe o Maven 3.3.3 de https://maven.apache.org/download.cgi
SO | Nome do arquivo |
---|---|
janelas | 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 |
Etapa 4: Extraia o arquivo Maven
Extraia o arquivo para o diretório em que deseja instalar o Maven 3.3.3. O subdiretório apache-maven-3.3.3 será criado a partir do arquivo.
SO | Localização (pode ser diferente com base na sua instalação) |
---|---|
janelas | C: \ Arquivos de programas \ Apache Software Foundation \ apache-maven-3.3.3 |
Linux | / usr / local / apache-maven |
Mac | / usr / local / apache-maven |
Etapa 5: definir as variáveis de ambiente Maven
Adicione M2_HOME, M2 e MAVEN_OPTS às variáveis de ambiente.
SO | Resultado |
---|---|
janelas | Defina as variáveis de ambiente usando propriedades do sistema. M2_HOME = C: \ Arquivos de programas \ Apache Software Foundation \ apache-maven-3.3.3 M2 =% M2_HOME% \ bin MAVEN_OPTS = -Xms256m -Xmx512m |
Linux | Abra o terminal de comando e defina as variáveis de ambiente. export M2_HOME = / usr / local / apache-maven / apache-maven-3.3.3 exportar M2 = $ M2_HOME / bin export MAVEN_OPTS = -Xms256m -Xmx512m |
Mac | Abra o terminal de comando e defina as variáveis de ambiente. export M2_HOME = / usr / local / apache-maven / apache-maven-3.3.3 exportar M2 = $ M2_HOME / bin export MAVEN_OPTS = -Xms256m -Xmx512m |
Etapa 6: adicione o local do diretório bin do Maven ao caminho do sistema
Agora anexe a variável M2 ao caminho do sistema.
SO | Resultado |
---|---|
janelas | Anexe a string;% M2% ao final da variável do sistema, Caminho. |
Linux | exportar PATH = $ M2: $ PATH |
Mac | exportar PATH = $ M2: $ PATH |
Etapa 7: verificar a instalação do Maven
Agora abra o console, execute o seguinte mvn comando.
SO | Tarefa | Comando |
---|---|---|
janelas | Abrir console de comando | c: \> mvn --version |
Linux | Abra o terminal de comando | $ mvn --version |
Mac | Terminal aberto | máquina: <joseph $ mvn --version |
Finalmente, verifique a saída dos comandos acima, que deve ser algo como mostrado abaixo -
SO | Resultado |
---|---|
janelas | Apache Maven 3.3.3 (7994120775791599e205a5524ec3e0dfe41d4a06; 2015-04-22T17: 27: 37 + 05: 30) Página inicial do Maven: C: \ Arquivos de programas \ Apache Software Foundation \ apache-maven-3.3.3 Versão Java: 1.7.0_75, fornecedor: Oracle Corporation Página inicial do Java: C: \ Arquivos de programas \ Java \ jdk1.7.0_75 \ jre Localidade padrão: en_US, codificação de plataforma: Cp1252 |
Linux | Apache Maven 3.3.3 (7994120775791599e205a5524ec3e0dfe41d4a06; 2015-04-22T17: 27: 37 + 05: 30) Página inicial do Maven: /usr/local/apache-maven/apache-maven-3.3.3 Versão Java: 1.7.0_75, fornecedor: Oracle Corporation Página inicial do Java: /usr/local/java-current/jdk1.7.0_75/jre |
Mac | Apache Maven 3.3.3 (7994120775791599e205a5524ec3e0dfe41d4a06; 2015-04-22T17: 27: 37 + 05: 30) Página inicial do Maven: /usr/local/apache-maven/apache-maven-3.3.3 Versão Java: 1.7.0_75, fornecedor: Oracle Corporation Página inicial do Java: /Library/Java/Home/jdk1.7.0_75/jre |
Etapa 8: Configurar IDE Eclipse
Todos os exemplos neste tutorial foram escritos usando o IDE Eclipse. Recomenda-se que os leitores tenham a versão mais recente do Eclipse instalada em suas máquinas. Para instalar o Eclipse IDE, baixe os binários mais recentes do Eclipse no seguinte linkhttps://www.eclipse.org/downloads/. Depois de fazer o download da instalação, descompacte a distribuição binária em um local conveniente.
Por exemplo em C:\eclipse nas janelas, ou /usr/local/eclipseno Linux / Unix e, finalmente, defina a variável PATH apropriadamente. O Eclipse pode ser iniciado executando os seguintes comandos na máquina Windows ou você pode simplesmente clicar duas vezes em eclipse.exe.
%C:\eclipse\eclipse.exe
O Eclipse pode ser iniciado executando os seguintes comandos na máquina UNIX (Solaris, Linux, etc.) -
$/usr/local/eclipse/eclipse
Após uma inicialização bem-sucedida, se tudo estiver bem, ele deve exibir a seguinte tela -
Etapa 9: configurar o Apache Tomcat
Podemos baixar a última versão do Tomcat em https://tomcat.apache.org/. Depois de fazer o download da instalação, descompacte a distribuição binária em um local conveniente. Por exemplo noC:\apache-tomcat-7.0.59 em uma máquina Windows, ou no /usr/local/apache-tomcat-7.0.59 em uma máquina Linux / Unix e, em seguida, defina o CATALINA_HOME variável de ambiente apontando para os locais de instalação.
O Tomcat pode ser iniciado executando os seguintes comandos em uma máquina Windows ou você pode simplesmente clicar duas vezes em startup.bat
%CATALINA_HOME%\bin\startup.bat
or
C:\apache-tomcat-7.0.59\bin\startup.bat
O Tomcat pode ser iniciado executando os seguintes comandos na máquina UNIX (Solaris, Linux, etc.) -
$CATALINA_HOME/bin/startup.sh
or
/usr/local/apache-tomcat-7.0.59/bin/startup.sh
Após uma inicialização bem-sucedida, os aplicativos da web padrão incluídos no Tomcat estarão disponíveis visitando - http://localhost:8080/. Se tudo estiver bem, ele deve exibir a seguinte tela -
Mais informações sobre como configurar e executar o Tomcat podem ser encontradas na documentação incluída aqui, bem como no site do Tomcat - https://tomcat.apache.org
O Tomcat pode ser interrompido executando os seguintes comandos em uma máquina Windows -
%CATALINA_HOME%\bin\shutdown
or
C:\apache-tomcat-7.0.59\bin\shutdown
O Tomcat pode ser interrompido executando os seguintes comandos na máquina UNIX (Solaris, Linux, etc.) -
$CATALINA_HOME/bin/shutdown.sh
or
/usr/local/apache-tomcat-7.0.59/bin/shutdown.sh
Depois de concluir essa última etapa, estamos prontos para prosseguir para o primeiro exemplo de serviços da Web, que discutiremos no próximo capítulo.
Vamos começar a escrever um serviço da web real baseado em SOAP com Spring-WS Framework. Antes de começarmos a escrever nosso primeiro exemplo usando a estrutura Spring-WS, temos que garantir que o ambiente Spring-WS seja configurado corretamente conforme explicado no capítulo Spring Web Services - Configuração do Ambiente . Estamos assumindo que os leitores têm algum conhecimento básico de trabalho com o IDE Eclipse.
Portanto, vamos continuar a escrever um aplicativo Spring WS simples que irá expor um método de serviço da web para reservar uma licença em um Portal de RH.
Abordagem de primeiro contrato
Spring-WS usa a abordagem de primeiro contrato, o que significa que devemos ter nosso XML Structurespronto antes de escrever qualquer código de implementação baseado em JAVA. Estamos definindo um objeto LeaveRequest, que possui subobjetos - Licença e Funcionário.
A seguir estão as construções XML necessárias -
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>
Crie o Projeto
Vamos agora abrir um console de comando, vá para o diretório C: \ MVN e execute o seguinte mvn comando.
C:\MVN>mvn archetype:generate -DarchetypeGroupId = org.springframework.ws
-DarchetypeArtifactId = spring-ws-archetype -DgroupId = com.tutorialspoint.hr
-DartifactId = leaveService
O Maven iniciará o processamento e criará a estrutura completa do projeto do aplicativo 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] ------------------------------------------------------------------------
Agora vá para C:/MVNdiretório. Veremos um projeto de aplicativo java criado com o nomeleaveService(conforme especificado em artifactId). Atualize o pom.xml e adicione HumanResourceService.java e HumanResourceServiceImpl.java na seguinte pasta - pasta C: \ MVN \ leaveService \ src \ main \ java \ com \ tutorialspoint \ hr \ service. Feito isso, adicione LeaveEndpoint.java na seguinte pasta - pasta 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>
Construir o Projeto
Vamos agora abrir o console de comando, vá para o diretório C: \ MVN \ leaveService e execute o seguinte mvn comando.
C:\MVN\leaveService>mvn clean package
Maven começará a construir o projeto.
[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 projeto no Eclipse
Siga as etapas fornecidas abaixo para importar o projeto no Eclipse.
Abra o Eclipse.
Selecione File → Import → opção.
Selecione a opção de projetos Maven. Clique no botão Avançar.
Selecione a localização do projeto, onde leaveService project foi criado usando Maven.
Clique no botão Concluir.
Execute o projeto
Assim que terminarmos de criar os arquivos de origem e configuração, exporte o aplicativo. Clique com o botão direito no aplicativo, use a opção Export → WAR File e salve o arquivo leaveService.war na pasta webapps do Tomcat.
Inicie o servidor Tomcat e verifique se podemos acessar outras páginas da web a partir da pasta webapps usando um navegador padrão. Tente acessar a URL - http: // localhost: 8080 / leaveService / leave.wsdl, se tudo estiver ok com o Spring Web Application, devemos ver a tela a seguir.
No capítulo anterior Spring -WS - First Application , geramos WSDL automaticamente usando a configuração Spring WS. Neste caso, mostraremos como expor o WSDL existente usando Spring WS.
Degrau | Descrição |
---|---|
1 | Crie um projeto com o nome leaveService em um pacote com.tutorialspoint conforme explicado no capítulo Spring WS - First Application. |
2 | Crie um WSDL leave.wsdl na subpasta / WEB-INF / wsdl. |
3 | Atualize spring-ws-servlet.xml na subpasta / WEB-INF. Estamos usando a tag static-wsdl aqui, em vez de dynamic-wsdl. |
4 | A etapa final é criar o conteúdo de todos os arquivos de origem e configuração e exportar o aplicativo conforme explicado a seguir. |
/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>
Execute o projeto
Assim que terminarmos de criar os arquivos de origem e configuração, devemos exportar o aplicativo. Clique com o botão direito no aplicativo, use a opção Exportar → Arquivo WAR e salve seu arquivo leaveService.war na pasta webapps do Tomcat.
Agora, inicie o servidor Tomcat e verifique se podemos acessar outras páginas da web a partir da pasta webapps usando um navegador padrão. Tente acessar a URL - http: // localhost: 8080 / leaveService / leave.wsdl, se tudo estiver ok com o Spring Web Application, veremos a tela a seguir.
Neste capítulo, entenderemos como criar um servidor de aplicativos da web usando Spring WS.
Degrau | Descrição |
---|---|
1 | Crie um projeto com o nome countryService em um pacote com.tutorialspoint conforme explicado no capítulo Spring WS - First Application. |
2 | Crie countries.xsd, classes de domínio, CountryRepository e CountryEndPoint conforme explicado nas etapas a seguir. |
3 | Atualize spring-ws-servlet.xml na subpasta / WEB-INF. |
4 | A etapa final é criar conteúdo para todos os arquivos de origem e configuração e exportar o aplicativo conforme explicado abaixo. |
countries.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>
Crie o Projeto
Vamos abrir o console de comando, vá para o diretório C: \ MVN e execute o seguinte mvn comando.
C:\MVN>mvn archetype:generate -DarchetypeGroupId = org.springframework.ws
-DarchetypeArtifactId = spring-ws-archetype -DgroupId = com.tutorialspoint
-DartifactId = countryService
O Maven iniciará o processamento e criará a estrutura completa do projeto do aplicativo 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] ------------------------------------------------------------------------
Agora vá para o diretório C: / MVN. Veremos um projeto de aplicativo java criado com o nome countryService (conforme especificado em artifactId). Atualize o 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>
Criar classes de domínio
Copie o countries.xsd na pasta C: \ mvn \ countryService \ src \ main \ resources. Vamos abrir o console de comando, vá para o diretório C: \ mvn \ countryService \ src \ main \ resources e execute o seguintexjc comando para gerar classes de domínio usando o countries.xsd.
C:\MVN\countryService\src\main\resources>xjc -p com.tutorialspoint countries.xsd
O Maven iniciará o processamento e criará as classes de domínio no pacote 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
Crie a pasta java na pasta C: \ mvn \ countryService \ src \ main. Copie todas as classes na pasta C: \ mvn \ countryService \ src \ main \ java. Crie CountryRepository e CountryEndPoint para representar o banco de dados do país e o servidor do 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>
Construir o Projeto
Vamos abrir o console de comando. Vá para o diretório C: \ MVN \ countryService e execute o seguintemvn comando.
C:\MVN\countryService>mvn clean package
Maven começará a construir o projeto.
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] ------------------------------------------------------------------------
Execute o projeto
Depois de criar os arquivos de origem e configuração, exporte o arquivo countryService.war na pasta webapps do Tomcat.
Agora, inicie o servidor Tomcat e verifique se podemos acessar outras páginas da web a partir da pasta webapps usando um navegador padrão. Faça uma solicitação POST para a URL - http: // localhost: 8080 / countryService / e, usando qualquer cliente SOAP, faça a seguinte solicitação.
<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>
Você verá o seguinte 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>
Neste capítulo, vamos entender como testar a unidade de um serviço de aplicativo da web criado usando Spring WS.
Degrau | Descrição |
---|---|
1 | Atualize o countryService do projeto criado no capítulo Spring WS - Write Server. Adicione a pasta src / test / java. |
2 | Crie CustomerEndPointTest.java na pasta - src / test / java / com / tutorialspoint / ws e atualize o POM.xml conforme detalhado abaixo. |
3 | Adicione spring-context.xml na subpasta src / main / resources. |
4 | A etapa final é criar conteúdo para todos os arquivos de origem e configuração e testar o aplicativo conforme explicado abaixo. |
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));
}
}
Construir o Projeto
Vamos abrir o console de comando, vá para o diretório C: \ MVN \ countryService e execute o seguinte comando mvn.
C:\MVN\countryService>mvn test
O Maven começará a construir e testar o projeto.
[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] ------------------------------------------------------------------------
Neste capítulo, aprenderemos como criar um cliente para o servidor de aplicativos da web criado no Spring WS - Writing Server usando Spring WS.
Degrau | Descrição |
---|---|
1 | Atualize o countryService do projeto no pacote com.tutorialspoint conforme explicado no capítulo Spring WS - Writing Server. |
2 | Crie CountryServiceClient.java no pacote com.tutorialspoint.client e MainApp.java no pacote com.tutorialspoint conforme explicado nas etapas a seguir. |
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());
}
}
Inicie o serviço da web
Inicie o servidor Tomcat e certifique-se de que podemos acessar outras páginas da web a partir da pasta webapps usando um navegador padrão.
Cliente de serviço da Web de teste
Clique com o botão direito em MainApp.java em seu aplicativo no Eclipse e use run as Java Applicationcomando. Se tudo estiver ok com o aplicativo, ele imprimirá a seguinte mensagem.
Country : United States
Capital : Washington
Population : 46704314
Currency : USD
Aqui, criamos um cliente - CountryServiceClient.javapara o serviço da web baseado em SOAP. MainApp usa CountryServiceClient para acessar o serviço da web, faz uma solicitação de postagem e obtém os dados.
Neste capítulo, aprenderemos como testar a unidade de um cliente criado no Spring WS - Writing Client para o servidor de aplicativos da web criado no capítulo Spring WS - Writing Server usando Spring WS.
Degrau | Descrição |
---|---|
1 | Atualize o countryService do projeto no pacote com.tutorialspoint conforme explicado no capítulo Spring WS - Writing Server. |
2 | Crie CountryServiceClientTest.java no pacote com.tutorialspoint na pasta SRC → Teste → Java conforme explicado nas etapas abaixo. |
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());
}
}
Inicie o serviço da web
Inicie o servidor Tomcat e verifique se podemos acessar outras páginas da web a partir da pasta webapps usando um navegador padrão.
Cliente de serviço da Web de teste de unidade
Vamos abrir o console de comando, vá para o diretório C: \ MVN \ countryService e execute o seguinte comando mvn.
C:\MVN\countryService>mvn test
O Maven começará a construir e testar o projeto.
[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] ------------------------------------------------------------------------