Spring WS - Szybki przewodnik
Spring Web Services (Spring-WS) to jeden z projektów opracowanych przez Spring Community. Jego głównym celem jest tworzenie usług internetowych opartych na dokumentach. Projekt Spring Web Services ułatwia zawieranie umówSOAP Service Development, zapewnia wiele sposobów tworzenia elastycznych usług internetowych, które mogą manipulować ładunkami XML na wiele sposobów.
Usługi sieciowe Spring bezproblemowo wykorzystują koncepcje Spring, takie jak iniekcja zależności i konfiguracje. Spring-WS wymaga wersji Spring 3.0. Zaczynamy od rozwoju w pierwszej kolejnościWSDL Contract a następnie użyje JAVA do wykonania wymaganej umowy.
W przeciwieństwie do ostatniego kontraktu, w którym interfejsy JAVA generują kontrakt WSDL / XSD. Kontrakt oparty na WSDL pozostaje niezależny od implementacji JAVA w podejściu „najpierw kontrakt”. W przypadku, gdy wymagamy zmiany interfejsów JAVA, nie ma potrzeby komunikowania zmian wprowadzonych w istniejącym kontrakcie WSDL użytkownikom usług internetowych. Spring-WS ma na celu zapewnienie luźnego powiązania między kontraktem WSDL a jego implementacją opartą na JAVA.
funkcje
Poniżej przedstawiono funkcje Spring Web Services -
XML Mapping to Objects - Żądania oparte na XML mogą być mapowane na dowolny obiekt przy użyciu informacji przechowywanych w Message Payload, SOAP Action Header lub przy użyciu wyrażenia XPath.
Multiple API Support to parse XML - Oprócz standardowych API JAXP (DOM, SAX, StAX) do parsowania przychodzących żądań XML, obsługiwane są także inne biblioteki, takie jak JDOM, dom4j, XOM.
Multiple API Support to marshal XML- Spring Web Services obsługuje biblioteki JAXB 1 i 2, Castor, XMLBeans, JiBX i XStream przy użyciu modułu mapowania obiektów / XML. Moduł mapowania obiektów / XML może być również używany w kodzie usług innych niż sieci Web.
Spring based configurations - Spring Web Services używa Spring Application Contexts dla swoich konfiguracji o podobnej architekturze jak Spring Web MVC.
Integrated WS-Security module - Za pomocą modułu WS-Security możesz podpisywać, szyfrować, odszyfrowywać wiadomości SOAP lub uwierzytelniać je.
Support for Acegi Security - Używając implementacji WS-Security Spring Web Services, konfiguracja Acegi może być używana dla twoich usług SOAP.
Architektura
Projekt Spring-WS składa się z pięciu głównych modułów, które wyjaśniono poniżej.
Spring-WS Core - Jest to podstawowy moduł i zapewnia centralne interfejsy, takie jak WebServiceMessage i SoapMessage, struktura po stronie serwera, potężne możliwości wysyłania wiadomości i klasy wsparcia do implementacji punktów końcowych usług sieci Web. Zapewnia również klienta konsumenckiego usługi sieci Web jakoWebServiceTemplate.
Spring-WS Support - Ten moduł zapewnia obsługę JMS, e-maili itp.
Spring-WS Security- Ten moduł jest odpowiedzialny za zapewnienie implementacji WS-Security zintegrowanej z podstawowym modułem usług sieciowych. Za pomocą tego modułu możemy dodawać główne tokeny, podpisywać, szyfrować i odszyfrowywać komunikaty SOAP. Moduł ten pozwala na wykorzystanie istniejącej implementacji Spring Security do uwierzytelniania i autoryzacji.
Spring XML- Ten moduł udostępnia klasy obsługi XML dla Spring Web Services. Ten moduł jest używany wewnętrznie przez framework Spring-WS.
Spring OXM - Ten moduł zapewnia obsługę klas XML vs Object Mapping.
W tym rozdziale zrozumiemy proces konfigurowania Spring-WS w systemach opartych na Windows i Linux. Spring-WS można łatwo zainstalować i zintegrować z prądemJava environment i MAVENwykonując kilka prostych kroków bez skomplikowanych procedur konfiguracji. Administracja użytkownikami jest wymagana podczas instalacji.
wymagania systemowe
Poniższa tabela przedstawia wymagania systemowe, a kolejne kroki przeprowadzą nas przez procedurę konfiguracji środowiska.
JDK | Java SE 2 JDK 1.5 lub nowsza |
Pamięć | 1 GB RAM (zalecane) |
Miejsca na dysku | Brak minimalnych wymagań |
Wersja systemu operacyjnego | Windows XP lub nowszy, Linux |
Przejdźmy teraz do kroków instalacji Spring-WS.
Krok 1: Zweryfikuj instalację oprogramowania Java
Na początek musisz mieć zainstalowany zestaw Java Software Development Kit (SDK) w swoim systemie. Aby to sprawdzić, wykonaj dowolne z następujących dwóch poleceń w zależności od platformy, na której pracujesz.
Jeśli instalacja Java została wykonana poprawnie, wyświetli się aktualna wersja i specyfikacja instalacji Java. Przykładowe dane wyjściowe podano w poniższej tabeli.
Platforma | Komenda | Przykładowe wyjście |
---|---|---|
Windows | Otwórz konsolę poleceń i wpisz - \> java -version |
Wersja Java „1.7.0_60” Środowisko wykonawcze Java (TM) SE (kompilacja 1.7.0_60-b19) Java Hotspot (TM) 64-bitowa maszyna wirtualna serwera (kompilacja 24.60-b09, tryb mieszany) |
Linux | Otwórz terminal poleceń i wpisz - $ java -version |
wersja java „1.7.0_25” Otwórz środowisko wykonawcze JDK (rhel-2.3.10.4.el6_4-x86_64) Otwórz 64-bitową maszynę wirtualną serwera JDK (kompilacja 23.7-b01, tryb mieszany) |
Zakładamy, że czytelnicy tego samouczka mają zainstalowany pakiet Java SDK w wersji 1.7.0_60 w swoim systemie.
Jeśli nie masz Java SDK, pobierz jego aktualną wersję z https://www.oracle.com/technetwork/java/javase/downloads/index.html i zainstaluj.
Krok 2: Skonfiguruj środowisko Java
Ustaw zmienną środowiskową JAVA_HOME aby wskazać lokalizację katalogu podstawowego, w którym na komputerze jest zainstalowana Java.
S.No. | Platforma i opis |
---|---|
1 | Windows Ustaw JAVA_HOME na C: \ ProgramFiles \ java \ jdk1.7.0_60 |
2 | Linux Eksportuj JAVA_HOME = / usr / local / java-current |
Dołącz pełną ścieżkę lokalizacji kompilatora Java do ścieżki systemowej.
S.No. | Platforma i opis |
---|---|
1 | Windows Dołącz ciąg „C: \ Program Files \ Java \ jdk1.7.0_60 \ bin” na końcu zmiennej systemowej PATH. |
2 | Linux Export PATH = $ PATH: $ JAVA_HOME / bin / |
Wykonaj polecenie java -version z wiersza polecenia, jak wyjaśniono powyżej.
Krok 3: Pobierz archiwum Maven
Pobierz Maven 3.3.3 z https://maven.apache.org/download.cgi
OS | Nazwa archiwum |
---|---|
Windows | apache-maven-3.3.3-bin.zip |
Linux | apache-maven-3.3.3-bin.tar.gz |
Prochowiec | apache-maven-3.3.3-bin.tar.gz |
Krok 4: Rozpakuj archiwum Maven
Wypakuj archiwum do katalogu, w którym chcesz zainstalować Maven 3.3.3. Z archiwum zostanie utworzony podkatalog apache-maven-3.3.3.
OS | Lokalizacja (może się różnić w zależności od instalacji) |
---|---|
Windows | C: \ Program Files \ Apache Software Foundation \ apache-maven-3.3.3 |
Linux | / usr / local / apache-maven |
Prochowiec | / usr / local / apache-maven |
Krok 5: Ustaw zmienne środowiskowe Maven
Dodaj M2_HOME, M2 i MAVEN_OPTS do zmiennych środowiskowych.
OS | Wynik |
---|---|
Windows | Ustaw zmienne środowiskowe za pomocą właściwości systemowych. M2_HOME = C: \ Program Files \ Apache Software Foundation \ apache-maven-3.3.3 M2 =% M2_HOME% \ bin MAVEN_OPTS = -Xms256m -Xmx512m |
Linux | Otwórz terminal poleceń i ustaw zmienne środowiskowe. export M2_HOME = / usr / local / apache-maven / apache-maven-3.3.3 eksport M2 = $ M2_HOME / bin eksport MAVEN_OPTS = -Xms256m -Xmx512m |
Prochowiec | Otwórz terminal poleceń i ustaw zmienne środowiskowe. export M2_HOME = / usr / local / apache-maven / apache-maven-3.3.3 eksport M2 = $ M2_HOME / bin eksport MAVEN_OPTS = -Xms256m -Xmx512m |
Krok 6: Dodaj lokalizację katalogu bin Maven do ścieżki systemowej
Teraz dołącz zmienną M2 do ścieżki systemowej.
OS | Wynik |
---|---|
Windows | Dołącz ciąg;% M2% na końcu zmiennej systemowej, Path. |
Linux | export PATH = $ M2: $ PATH |
Prochowiec | export PATH = $ M2: $ PATH |
Krok 7: Sprawdź instalację Mavena
Teraz otwórz konsolę, wykonaj następujące czynności mvn Komenda.
OS | Zadanie | Komenda |
---|---|---|
Windows | Otwórz konsolę poleceń | c: \> mvn --version |
Linux | Otwórz terminal poleceń | $ mvn --version |
Prochowiec | Otwórz terminal | maszyna: <joseph $ mvn --version |
Na koniec sprawdź wyjście powyższych poleceń, które powinno być takie, jak pokazano poniżej -
OS | Wynik |
---|---|
Windows | Apache Maven 3.3.3 (7994120775791599e205a5524ec3e0dfe41d4a06; 2015-04-22T17: 27: 37 + 05: 30) Strona główna Mavena: C: \ Program Files \ Apache Software Foundation \ apache-maven-3.3.3 Wersja Java: 1.7.0_75, producent: Oracle Corporation Strona główna Java: C: \ Program Files \ Java \ jdk1.7.0_75 \ jre Domyślne ustawienia regionalne: en_US, kodowanie platformy: Cp1252 |
Linux | Apache Maven 3.3.3 (7994120775791599e205a5524ec3e0dfe41d4a06; 2015-04-22T17: 27: 37 + 05: 30) Strona główna Mavena: /usr/local/apache-maven/apache-maven-3.3.3 Wersja Java: 1.7.0_75, producent: Oracle Corporation Strona główna Java: /usr/local/java-current/jdk1.7.0_75/jre |
Prochowiec | Apache Maven 3.3.3 (7994120775791599e205a5524ec3e0dfe41d4a06; 2015-04-22T17: 27: 37 + 05: 30) Strona główna Mavena: /usr/local/apache-maven/apache-maven-3.3.3 Wersja Java: 1.7.0_75, producent: Oracle Corporation Strona główna Java: /Library/Java/Home/jdk1.7.0_75/jre |
Krok 8: Skonfiguruj Eclipse IDE
Wszystkie przykłady w tym samouczku zostały napisane przy użyciu środowiska Eclipse IDE. Zaleca się, aby czytelnicy mieli zainstalowaną najnowszą wersję Eclipse na swoim komputerze. Aby zainstalować środowisko Eclipse IDE, pobierz najnowsze pliki binarne Eclipse z poniższego łączahttps://www.eclipse.org/downloads/. Po pobraniu instalacji rozpakuj dystrybucję binarną w dogodnym miejscu.
Na przykład w C:\eclipse w systemie Windows lub /usr/local/eclipsew systemie Linux / Unix i na koniec odpowiednio ustaw zmienną PATH. Eclipse można uruchomić, wykonując następujące polecenia na komputerze z systemem Windows lub klikając dwukrotnie plik eclipse.exe.
%C:\eclipse\eclipse.exe
Eclipse można uruchomić, wykonując następujące polecenia na komputerze z systemem UNIX (Solaris, Linux itp.) -
$/usr/local/eclipse/eclipse
Po udanym uruchomieniu, jeśli wszystko jest w porządku, powinien wyświetlić następujący ekran -
Krok 9: Skonfiguruj Apache Tomcat
Najnowszą wersję Tomcata możemy pobrać z witryny https://tomcat.apache.org/. Po pobraniu instalacji rozpakuj dystrybucję binarną w dogodnym miejscu. Na przykład wC:\apache-tomcat-7.0.59 na komputerze z systemem Windows lub w /usr/local/apache-tomcat-7.0.59 na komputerze z systemem Linux / Unix, a następnie ustaw plik CATALINA_HOME zmienna środowiskowa wskazująca miejsca instalacji.
Tomcat można uruchomić, wykonując następujące polecenia na komputerze z systemem Windows lub po prostu klikając dwukrotnie plik startup.bat
%CATALINA_HOME%\bin\startup.bat
or
C:\apache-tomcat-7.0.59\bin\startup.bat
Tomcat można uruchomić, wykonując następujące polecenia na komputerze z systemem UNIX (Solaris, Linux itp.) -
$CATALINA_HOME/bin/startup.sh
or
/usr/local/apache-tomcat-7.0.59/bin/startup.sh
Po pomyślnym uruchomieniu domyślne aplikacje internetowe dołączone do Tomcat będą dostępne pod adresem - http://localhost:8080/. Jeśli wszystko jest w porządku, powinien wyświetlić następujący ekran -
Więcej informacji na temat konfiguracji i uruchamiania Tomcat można znaleźć w dokumentacji dołączonej tutaj, a także na stronie Tomcat - https://tomcat.apache.org
Tomcat można zatrzymać, wykonując następujące polecenia na komputerze z systemem Windows -
%CATALINA_HOME%\bin\shutdown
or
C:\apache-tomcat-7.0.59\bin\shutdown
Tomcat można zatrzymać, wykonując następujące polecenia na komputerze z systemem UNIX (Solaris, Linux itp.) -
$CATALINA_HOME/bin/shutdown.sh
or
/usr/local/apache-tomcat-7.0.59/bin/shutdown.sh
Kiedy skończymy z tym ostatnim krokiem, możemy przejść do pierwszego przykładu usług internetowych, który omówimy w następnym rozdziale.
Zacznijmy pisać rzeczywistą usługę sieciową opartą na SOAP za pomocą Spring-WS Framework. Zanim zaczniemy pisać nasz pierwszy przykład z wykorzystaniem frameworka Spring-WS, musimy upewnić się, że środowisko Spring-WS jest poprawnie skonfigurowane, jak wyjaśniono w rozdziale Spring Web Services - Konfiguracja środowiska . Zakładamy, że czytelnicy mają podstawową wiedzę na temat pracy z Eclipse IDE.
Dlatego przejdźmy do napisania prostej aplikacji Spring WS, która ujawni metodę usługi sieciowej do rezerwacji urlopu w portalu HR.
Podejście najpierw kontraktu
Spring-WS stosuje podejście „Najpierw kontrakt”, co oznacza, że powinniśmy mieć nasze XML Structuresgotowy przed napisaniem dowolnego kodu wdrożeniowego opartego na JAVA. Definiujemy obiekt LeaveRequest, który ma podobiekty - Urlop i Pracownik.
Poniżej przedstawiono wymagane konstrukcje XML -
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>
Utwórz projekt
Otwórzmy teraz konsolę poleceń, przejdźmy do katalogu C: \ MVN i wykonajmy następujące czynności mvn Komenda.
C:\MVN>mvn archetype:generate -DarchetypeGroupId = org.springframework.ws
-DarchetypeArtifactId = spring-ws-archetype -DgroupId = com.tutorialspoint.hr
-DartifactId = leaveService
Maven rozpocznie przetwarzanie i utworzy pełną strukturę projektu aplikacji 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] ------------------------------------------------------------------------
Teraz idź do C:/MVNinformator. Zobaczymy utworzony projekt aplikacji java o nazwieleaveService(jak określono w artifactId). Zaktualizuj pom.xml i dodaj HumanResourceService.java i HumanResourceServiceImpl.java w następującym folderze - C: \ MVN \ leaveService \ src \ main \ java \ com \ tutorialspoint \ hr \ service. Gdy to zrobisz, dodaj LeaveEndpoint.java do następującego folderu - 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>
Zbuduj projekt
Otwórzmy teraz konsolę poleceń, przejdź do katalogu C: \ MVN \ leaveService i wykonaj następujące czynności mvn Komenda.
C:\MVN\leaveService>mvn clean package
Maven rozpocznie budowę projektu.
[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] ------------------------------------------------------------------------
Importuj projekt w Eclipse
Wykonaj poniższe kroki, aby zaimportować projekt do Eclipse.
Otwórz Eclipse.
Wybierz File → Import → opcja.
Wybierz opcję Maven Projekty. Kliknij przycisk Dalej.
Wybierz lokalizację projektu, gdzie leaveService project został stworzony przy użyciu Mavena.
Kliknij przycisk Zakończ.
Uruchom projekt
Gdy skończymy tworzyć pliki źródłowe i konfiguracyjne, wyeksportuj aplikację. Kliknij aplikację prawym przyciskiem myszy, użyj opcji Eksportuj → Plik WAR i zapisz plik leaveService.war w folderze webapps Tomcata.
Uruchom serwer Tomcat i upewnij się, że jesteśmy w stanie uzyskać dostęp do innych stron internetowych z folderu webapps przy użyciu standardowej przeglądarki. Spróbuj uzyskać dostęp do adresu URL - http: // localhost: 8080 / leaveService / leave.wsdl, jeśli wszystko jest w porządku z aplikacją internetową Spring, powinien pojawić się następujący ekran.
W poprzednim rozdziale Spring -WS - Pierwsza aplikacja wygenerowaliśmy automatycznie WSDL przy użyciu konfiguracji Spring WS. W tym przypadku pokażemy, jak udostępnić istniejący WSDL za pomocą Spring WS.
Krok | Opis |
---|---|
1 | Utwórz projekt o nazwie leaveService w pakiecie com.tutorialspoint, jak wyjaśniono w rozdziale Spring WS - Pierwsza aplikacja. |
2 | Utwórz plik WSDL leave.wsdl w podfolderze / WEB-INF / wsdl. |
3 | Zaktualizuj spring-ws-servlet.xml w podfolderze / WEB-INF. Używamy tutaj tagu static-wsdl zamiast dynamicznego-wsdl. |
4 | Ostatnim krokiem jest utworzenie zawartości wszystkich plików źródłowych i konfiguracyjnych oraz wyeksportowanie aplikacji, jak wyjaśniono poniżej. |
/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>
Uruchom projekt
Gdy skończymy tworzyć pliki źródłowe i konfiguracyjne, powinniśmy wyeksportować aplikację. Kliknij aplikację prawym przyciskiem myszy, użyj opcji Eksportuj → Plik WAR i zapisz plik leaveService.war w folderze webapps Tomcata.
Teraz uruchom serwer Tomcat i upewnij się, że możemy uzyskać dostęp do innych stron internetowych z folderu webapps przy użyciu standardowej przeglądarki. Spróbuj uzyskać dostęp do adresu URL - http: // localhost: 8080 / leaveService / leave.wsdl, jeśli wszystko jest w porządku z aplikacją internetową Spring, zobaczymy następujący ekran.
W tym rozdziale zrozumiemy, jak utworzyć serwer aplikacji internetowych przy użyciu Spring WS.
Krok | Opis |
---|---|
1 | Utwórz projekt o nazwie countryService w pakiecie com.tutorialspoint, jak wyjaśniono w rozdziale Spring WS - Pierwsza aplikacja. |
2 | Utwórz countries.xsd, klasy domeny, CountryRepository i CountryEndPoint, jak wyjaśniono w poniższych krokach. |
3 | Zaktualizuj spring-ws-servlet.xml w podfolderze / WEB-INF. |
4 | Ostatnim krokiem jest utworzenie zawartości dla wszystkich plików źródłowych i konfiguracyjnych oraz wyeksportowanie aplikacji, jak wyjaśniono poniżej. |
kraje.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>
Utwórz projekt
Otwórzmy konsolę poleceń, przejdźmy do katalogu C: \ MVN i wykonajmy następujące czynności mvn Komenda.
C:\MVN>mvn archetype:generate -DarchetypeGroupId = org.springframework.ws
-DarchetypeArtifactId = spring-ws-archetype -DgroupId = com.tutorialspoint
-DartifactId = countryService
Maven rozpocznie przetwarzanie i utworzy pełną strukturę projektu aplikacji 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] ------------------------------------------------------------------------
Teraz przejdź do katalogu C: / MVN. Zobaczymy utworzony projekt aplikacji Java o nazwie countryService (jak określono w artifactId). Zaktualizuj 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>
Utwórz klasy domeny
Skopiuj kraje.xsd do folderu C: \ mvn \ countryService \ src \ main \ resources. Otwórzmy konsolę poleceń, przejdź do katalogu C: \ mvn \ countryService \ src \ main \ resources i wykonaj następujące czynnościxjc polecenie do generowania klas domen przy użyciu pliku countries.xsd.
C:\MVN\countryService\src\main\resources>xjc -p com.tutorialspoint countries.xsd
Maven rozpocznie przetwarzanie i utworzy klasy domeny w pakiecie 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
Utwórz folder java w folderze głównym C: \ mvn \ countryService \ src \. Skopiuj wszystkie klasy z folderu C: \ mvn \ countryService \ src \ main \ java. Utwórz CountryRepository i CountryEndPoint, aby reprezentować odpowiednio bazę danych kraju i serwer kraju.
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>
Zbuduj projekt
Otwórzmy konsolę poleceń. Przejdź do katalogu C: \ MVN \ countryService i wykonaj następujące czynnościmvn Komenda.
C:\MVN\countryService>mvn clean package
Maven rozpocznie budowę projektu.
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] ------------------------------------------------------------------------
Uruchom projekt
Po utworzeniu plików źródłowych i konfiguracyjnych wyeksportuj plik countryService.war do folderu webapps serwera Tomcat.
Teraz uruchom serwer Tomcat i upewnij się, że możemy uzyskać dostęp do innych stron internetowych z folderu webapps przy użyciu standardowej przeglądarki. Wykonaj żądanie POST pod adresem URL - http: // localhost: 8080 / countryService / i używając dowolnego klienta SOAP, wykonaj następujące żądanie.
<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>
Zobaczysz następujący wynik.
<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>
W tym rozdziale zrozumiemy, jak przeprowadzić testy jednostkowe usługi aplikacji internetowej utworzonej przy użyciu Spring WS.
Krok | Opis |
---|---|
1 | Zaktualizuj projekt countryService utworzony w rozdziale Spring WS - Write Server. Dodaj folder src / test / java. |
2 | Utwórz CustomerEndPointTest.java w folderze - src / test / java / com / tutorialspoint / ws, a następnie zaktualizuj POM.xml zgodnie z opisem poniżej. |
3 | Dodaj spring-context.xml w podfolderze src / main / resources. |
4 | Ostatnim krokiem jest utworzenie zawartości dla wszystkich plików źródłowych i konfiguracyjnych oraz przetestowanie aplikacji, jak wyjaśniono poniżej. |
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));
}
}
Zbuduj projekt
Otwórzmy konsolę poleceń, przejdź do katalogu C: \ MVN \ countryService i wykonaj następujące polecenie mvn.
C:\MVN\countryService>mvn test
Maven rozpocznie tworzenie i testowanie projektu.
[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] ------------------------------------------------------------------------
W tym rozdziale dowiemy się, jak utworzyć klienta dla serwera aplikacji WWW utworzonego w Spring WS - Writing Server przy użyciu Spring WS.
Krok | Opis |
---|---|
1 | Zaktualizuj projekt countryService w pakiecie com.tutorialspoint, jak wyjaśniono w rozdziale Spring WS - Writing Server. |
2 | Utwórz CountryServiceClient.java w pakiecie com.tutorialspoint.client i MainApp.java w pakiecie com.tutorialspoint, jak wyjaśniono w poniższych krokach. |
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());
}
}
Uruchom usługę sieci Web
Uruchom serwer Tomcat i upewnij się, że możemy uzyskać dostęp do innych stron internetowych z folderu webapps przy użyciu standardowej przeglądarki.
Przetestuj klienta usługi sieci Web
Kliknij prawym przyciskiem myszy plik MainApp.java w swojej aplikacji pod Eclipse i użyj run as Java ApplicationKomenda. Jeśli wszystko jest w porządku z aplikacją, wydrukuje następujący komunikat.
Country : United States
Capital : Washington
Population : 46704314
Currency : USD
Tutaj stworzyliśmy Klienta - CountryServiceClient.javadla usługi sieciowej opartej na SOAP. MainApp używa CountryServiceClient, aby wykonać trafienie do usługi internetowej, wysyła żądanie postu i pobiera dane.
W tym rozdziale dowiemy się, jak przeprowadzić testy jednostkowe klienta utworzonego w Spring WS - Writing Client dla serwera aplikacji webowej utworzonej w rozdziale Spring WS - Writing Server using Spring WS.
Krok | Opis |
---|---|
1 | Zaktualizuj projekt countryService w pakiecie com.tutorialspoint, jak wyjaśniono w rozdziale Spring WS - Writing Server. |
2 | Utwórz CountryServiceClientTest.java w pakiecie com.tutorialspoint w folderze SRC → Test → Java, jak wyjaśniono w krokach podanych poniżej. |
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());
}
}
Uruchom usługę sieci Web
Uruchom serwer Tomcat i upewnij się, że jesteśmy w stanie uzyskać dostęp do innych stron internetowych z folderu webapps przy użyciu standardowej przeglądarki.
Klient usługi sieci Web testów jednostkowych
Otwórzmy konsolę poleceń, przejdź do katalogu C: \ MVN \ countryService i wykonaj następujące polecenie mvn.
C:\MVN\countryService>mvn test
Maven rozpocznie tworzenie i testowanie projektu.
[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] ------------------------------------------------------------------------