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] ------------------------------------------------------------------------