Springws-quick-guide

提供:Dev Guides
移動先:案内検索

Spring WS-概要

Spring Web Services(Spring-WS)は、Spring Communityが開発したプロジェクトの1つです。 その主な焦点は、ドキュメント駆動型のWebサービスを作成することです。 Spring Webサービスプロジェクトは、コントラクトファースト* SOAPサービス開発*を促進し、柔軟なWebサービスを作成する複数の方法を提供します。これにより、XMLペイロードを複数の方法で操作できます。

Spring Webサービスは、依存性注入や構成などのSpringの概念をシームレスに使用します。 Spring-WSにはSpring 3.0バージョンが必要です。 コントラクトファースト開発では、 WSDL Contract から始め、JAVAを使用して必要なコントラクトを実装します。

JAVAインターフェースがWSDL/XSDコントラクトを生成するコントラクトラストアプローチとは対照的。 WSDLベースのコントラクトは、コントラクトファーストアプローチのJAVA実装に依存しません。 JAVAインターフェースの変更が必要な場合、既存のWSDLコントラクトで行われた変更をWebサービスユーザーに伝える必要はありません。 Spring-WSは、WSDLコントラクトとそのJavaベースの実装との間の疎結合を提供することを目的としています。

特徴

以下は、Spring Webサービスの機能です-

  • オブジェクトへのXMLマッピング-XMLベースのリクエストは、メッセージペイロード、SOAPアクションヘッダーに保存されている情報を使用して、またはXPath式を使用して、任意のオブジェクトにマッピングできます。
  • * XMLを解析するための複数のAPIサポート*-着信XMLリクエストを解析するための標準JAXP API(DOM、SAX、StAX)の他に、JDOM、dom4j、XOMなどの他のライブラリもサポートされています。
  • XMLをマーシャルする複数のAPIサポート-Spring Webサービスは、オブジェクト/XMLマッピングモジュールを使用して、JAXB 1および2、Castor、XMLBeans、JiBX、およびXStreamライブラリをサポートします。 オブジェクト/XMLマッピングモジュールは、非Webサービスコードでも使用できます。
  • * Springベースの構成*-Spring Webサービスは、Spring Web MVCと同様のアーキテクチャを持つ構成にSpringアプリケーションコンテキストを使用します。
  • 統合されたWS-Securityモジュール-WS-Securityモジュールを使用して、SOAPメッセージに署名、暗号化、復号化、または認証することができます。
  • * Acegiセキュリティのサポート*-Spring WebサービスのWS-Security実装を使用すると、Acegi構成をSOAPサービスに使用できます。

建築

Spring-WSプロジェクトは、以下で説明する5つの主要なモジュールで構成されています。

  • Spring-WS Core -プライマリモジュールであり、 WebServiceMessageSoapMessage などの中央インターフェイス、サーバー側フレームワーク、強力なメッセージディスパッチ機能、およびWebサービスエンドポイントを実装するサポートクラスを提供します。 また、Webサービスコンシューマクライアントを WebServiceTemplate として提供します。
  • * Spring-WSサポート*-このモジュールは、JMS、電子メールなどのサポートを提供します。
  • Spring-WS Security -このモジュールは、コアWebサービスモジュールと統合されたWS-Security実装を提供します。 このモジュールを使用して、プリンシパルトークンを追加し、SOAPメッセージに署名、暗号化、および復号化できます。 このモジュールにより、既存のSpring Security実装を認証と承認に使用できます。
  • Spring XML -このモジュールは、Spring WebサービスのXMLサポートクラスを提供します。 このモジュールは、Spring-WSフレームワークによって内部的に使用されます。
  • Spring OXM -このモジュールは、XML対オブジェクトマッピングのサポートクラスを提供します。

Spring Web Services Architecture

Spring WS-環境設定

この章では、WindowsおよびLinuxベースのシステムでSpring-WSをセットアップするプロセスを理解します。 Spring-WSは、複雑なセットアップ手順なしでいくつかの簡単な手順に従うだけで、現在の* Java環境*および MAVEN に簡単にインストールして統合できます。 インストール中にユーザー管理が必要です。

システム要求

次の表にシステム要件を示します。その後の手順では、環境のセットアップ手順を説明します。

JDK Java SE 2 JDK 1.5 or above
Memory 1 GB RAM (recommended)
Disk Space No minimum requirement
Operating System Version Windows XP or above, Linux

Spring-WSをインストールする手順に進みましょう。

ステップ1:Javaインストールの確認

まず、システムにJava Software Development Kit(SDK)をインストールする必要があります。 これを確認するには、作業しているプラ​​ットフォームに応じて、次の2つのコマンドのいずれかを実行します。

Javaインストールが適切に行われている場合、Javaインストールの現在のバージョンと仕様が表示されます。 サンプル出力を次の表に示します。

Platform Command Sample Output
Windows

Open command console and type −

\> java -version

a

Javaバージョン「1.7.0_60」

Java(TM)SEランタイム環境(ビルド1.7.0_60-b19)

Java Hotspot(TM)64ビットサーバーVM(ビルド24.60-b09、混合モード)

Linux

Open command terminal and type −

$ java -version

a

Javaバージョン "1.7.0_25"

JDKランタイム環境を開く(rhel-2.3.10.4.el6_4-x86_64)

JDK 64ビットサーバーVMを開く(ビルド23.7-b01、混合モード)

ステップ2:Java環境を設定する

環境変数 JAVA_HOME を設定して、マシンにJavaがインストールされているベースディレクトリの場所を指すようにします。

S.No. Platform & Description
1

Windows

JAVA_HOMEをC:\ ProgramFiles \ java \ jdk1.7.0_60に設定します

2

Linux

JAVA_HOME =/usr/local/java-currentをエクスポート

Javaコンパイラの場所の完全パスをシステムパスに追加します。

S.No. Platform & Description
1

Windows

文字列「C:\ Program Files \ Java \ jdk1.7.0_60 \ bin」をシステム変数PATHの最後に追加します。

2

Linux

PATH = $ PATH:$ JAVA_HOME/bin/をエクスポートします

上記で説明したように、コマンドプロンプトからコマンド java -version を実行します。

ステップ3:Mavenアーカイブをダウンロードする

[[1]] 3.3.3をダウンロードします

OS Archive name
Windows apache-maven-3.3.3-bin.zip
Linux apache-maven-3.3.3-bin.tar.gz
Mac apache-maven-3.3.3-bin.tar.gz

ステップ4:Mavenアーカイブを抽出する

Maven 3.3.3をインストールするディレクトリにアーカイブを抽出します。 サブディレクトリapache-maven-3.3.3がアーカイブから作成されます。

OS Location (can be different based on your installation)
Windows C:\Program Files\Apache Software Foundation\apache-maven-3.3.3
Linux /usr/local/apache-maven
Mac /usr/local/apache-maven

ステップ5:Maven環境変数を設定する

M2_HOME、M2、およびMAVEN_OPTSを環境変数に追加します。

OS Output
Windows

Set the environment variables using system properties.

M2_HOME = C:\ Program Files \ Apache Software Foundation \ apache-maven-3.3.3

M2 =%M2_HOME%\ bin

MAVEN_OPTS = -Xms256m -Xmx512m

Linux

Open command terminal and set environment variables.

export M2_HOME =/usr/local/apache-maven/apache-maven-3.3.3

export M2 = $ M2_HOME/bin

エクスポートMAVEN_OPTS = -Xms256m -Xmx512m

Mac

Open command terminal and set environment variables.

export M2_HOME =/usr/local/apache-maven/apache-maven-3.3.3

export M2 = $ M2_HOME/bin

エクスポートMAVEN_OPTS = -Xms256m -Xmx512m

ステップ6:Maven binディレクトリの場所をシステムパスに追加する

次に、システムパスにM2変数を追加します。

OS Output
Windows Append the string ;%M2% to the end of the system variable, Path.
Linux export PATH=$M2:$PATH
Mac export PATH=$M2:$PATH

ステップ7:Mavenのインストールを確認する

コンソールを開き、次の mvn コマンドを実行します。

OS Task Command
Windows Open Command Console c:\> mvn --version
Linux Open Command Terminal $ mvn --version
Mac Open Terminal machine:< joseph$ mvn --version

最後に、上記のコマンドの出力を確認します。これは、次のようになります。

OS Output
Windows

Apache Maven 3.3.3 (7994120775791599e205a5524ec3e0dfe41d4a06; 2015-04-22T17:27:37+05:30)

Mavenホーム:C:\ Program Files \ Apache Software Foundation \ apache-maven-3.3.3

Javaバージョン:1.7.0_75、ベンダー:Oracle Corporation

Javaホーム:C:\ Program Files \ Java \ jdk1.7.0_75 \ jre

デフォルトロケール:en_US、プラットフォームエンコーディング:Cp1252

Linux

Apache Maven 3.3.3 (7994120775791599e205a5524ec3e0dfe41d4a06; 2015-04-22T17:27:37+05:30)

Mavenホーム:/usr/local/apache-maven/apache-maven-3.3.3

Javaバージョン:1.7.0_75、ベンダー:Oracle Corporation

Javaホーム:/usr/local/java-current/jdk1.7.0_75/jre

Mac

Apache Maven 3.3.3 (7994120775791599e205a5524ec3e0dfe41d4a06; 2015-04-22T17:27:37+05:30)

Mavenホーム:/usr/local/apache-maven/apache-maven-3.3.3

Javaバージョン:1.7.0_75、ベンダー:Oracle Corporation

Javaホーム:/Library/Java/Home/jdk1.7.0_75/jre

ステップ8:Eclipse IDEのセットアップ

このチュートリアルのすべての例は、Eclipse IDEを使用して作成されています。 読者が最新バージョンのEclipseをマシンにインストールすることをお勧めします。 Eclipse IDEをインストールするには、次のリンクhttps://www.eclipse.org/downloads/から最新のEclipseバイナリをダウンロードします。 インストールがダウンロードされたら、バイナリ配布物を便利な場所に解凍します。

たとえば、Windowsの C:\ eclipse 、またはLinux/Unixの /usr/local/eclipse で、最後にPATH変数を適切に設定します。 Eclipseは、Windowsマシンで次のコマンドを実行することで開始できます。または、eclipse.exeをダブルクリックするだけです。

%C:\eclipse\eclipse.exe

Eclipseは、UNIX(Solaris、Linuxなど)マシンで次のコマンドを実行することで開始できます-

$/usr/local/eclipse/eclipse

正常に起動した後、すべてが正常であれば、次の画面が表示されます-

Eclipseホームページ

ステップ9:Apache Tomcatのセットアップ

Tomcatの最新バージョンはhttps://tomcat.apache.org/からダウンロードできます。 インストールがダウンロードされたら、バイナリ配布物を便利な場所に解凍します。 たとえば、Windowsマシンの C:\ apache-tomcat-7.0.59 、またはLinux/Unixマシンの /usr/local/apache-tomcat-7.0.59 で、* CATALINA_HOMEを設定します*インストール場所を指す環境変数。

Tomcatは、Windowsマシンで次のコマンドを実行することで起動できます。または、startup.batをダブルクリックするだけです。

%CATALINA_HOME%\bin\startup.bat

or

C:\apache-tomcat-7.0.59\bin\startup.bat

TomcatはUNIX(Solaris、Linuxなど)マシンで次のコマンドを実行することで起動できます-

$CATALINA_HOME/bin/startup.sh

or

/usr/local/apache-tomcat-7.0.59/bin/startup.sh

正常に起動した後、Tomcatに含まれるデフォルトのWebアプリケーションにアクセスするには、 http://localhost:8080/ にアクセスします。 すべてがOKであれば、それは次の画面を表示する必要があります-

Tomcat

Tomcatの構成と実行に関する詳細情報は、Tomcat Webサイト(https://tomcat.apache.org)だけでなく、ここに含まれるドキュメントにも記載されています。

Tomcatは、Windowsマシンで次のコマンドを実行することで停止できます-

%CATALINA_HOME%\bin\shutdown

or

C:\apache-tomcat-7.0.59\bin\shutdown

Tomcatは、UNIX(Solaris、Linuxなど)マシンで次のコマンドを実行することで停止できます-

$CATALINA_HOME/bin/shutdown.sh

or

/usr/local/apache-tomcat-7.0.59/bin/shutdown.sh

この最後の手順を完了すると、次の章で説明する最初のWebサービスの例に進む準備ができました。

Spring WS-最初のアプリケーション

Spring-WS Frameworkを使用して、実際のSOAPベースのWebサービスの作成を始めましょう。 Spring-WSフレームワークを使用して最初の例を書き始める前に、link:/springws/springws_environment_setup [Spring Web Services-Environment Setup]の章で説明されているように、Spring-WS環境が適切にセットアップされていることを確認する必要があります。 読者にはEclipse IDEの基本的な実用知識があることを前提としています。

したがって、HRポータルで休暇を予約するためのWebサービスメソッドを公開する簡単なSpring WSアプリケーションの作成に進みましょう。

契約優先アプローチ

Spring-WSは契約優先アプローチを使用します。つまり、JAVAベースの実装コードを記述する前に、* XML構造*を用意しておく必要があります。 サブオブジェクト– LeaveおよびEmployeeを持つLeaveRequestオブジェクトを定義しています。

以下は、必要なXML構造です-

Leave.xml

<Leave xmlns = "http://finddevguides.com/hr/schemas">
   <StartDate>2016-07-03</StartDate>
   <EndDate>2016-07-07</EndDate>
</Leave>

Employee.xml

<Employee xmlns = "http://finddevguides.com/hr/schemas">
   <Number>404</Number>
   <FirstName>Mahesh</FirstName>
   <LastName>Parashar</LastName>
</Employee>

LeaveRequest.xml

<LeaveRequest xmlns = "http://finddevguides.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://finddevguides.com/hr/schemas"
   elementFormDefault = "qualified"
   targetNamespace = "http://finddevguides.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>

プロジェクトを作成する

コマンドコンソールを開き、C:\ MVNディレクトリに移動して、次の mvn コマンドを実行します。

C:\MVN>mvn archetype:generate -DarchetypeGroupId = org.springframework.ws
-DarchetypeArtifactId = spring-ws-archetype -DgroupId = com.finddevguides.hr
-DartifactId = leaveService

Mavenは処理を開始し、完全なJavaアプリケーションプロジェクト構造を作成します。

[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] Using property: groupId = com.finddevguides.hr
[INFO] Using property: artifactId = leaveService
Define value for property 'version':  1.0-SNAPSHOT: :
[INFO] Using property: package = com.finddevguides.hr
Confirm properties configuration:
groupId: com.finddevguides.hr
artifactId: leaveService
version: 1.0-SNAPSHOT
package: com.finddevguides.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.finddevguides.hr
[INFO] Parameter: packageName, Value: com.finddevguides.hr
[INFO] Parameter: package, Value: com.finddevguides.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] ------------------------------------------------------------------------

次に、 C:/MVN ディレクトリに移動します。 leaveService (artifactIdで指定)という名前で作成されたJavaアプリケーションプロジェクトが表示されます。 pom.xmlを更新し、HumanResourceService.javaおよびHumanResourceServiceImpl.javaをC:\ MVN \ leaveService \ src \ main \ java \ com \ finddevguides \ hr \ serviceフォルダーに追加します。 それが終わったら、LeaveEndpoint.javaをC:\ MVN \ leaveService \ src \ main \ java \ com \ finddevguides \ 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.finddevguides.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.finddevguides.hr.service;

import java.util.Date;

public interface HumanResourceService {
   void bookLeave(Date startDate, Date endDate, String name);
}

HumanResourceServiceImpl.java

package com.finddevguides.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.finddevguides.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.finddevguides.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://finddevguides.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.finddevguides.hr"/>
   <bean id = "humanResourceService"
      class = "com.finddevguides.hr.service.HumanResourceServiceImpl"/>
   <sws:annotation-driven/>

   <sws:dynamic-wsdl id = "leave"
      portTypeName = "HumanResource"
      locationUri = "/leaveService/"
      targetNamespace = "http://finddevguides.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>finddevguides 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://finddevguides.com/hr/schemas"
   elementFormDefault = "qualified"
   targetNamespace = "http://finddevguides.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>

プロジェクトを構築する

コマンドコンソールを開き、C:\ MVN \ leaveServiceディレクトリに移動して、次の mvn コマンドを実行します。

C:\MVN\leaveService>mvn clean package

Mavenはプロジェクトの構築を開始します。

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

Eclipseでプロジェクトをインポートする

以下の手順に従って、プロジェクトをEclipseにインポートします。

  • Eclipseを開きます。
  • *ファイル→インポート→*オプションを選択します。
  • Mavenプロジェクトオプションを選択します。 [次へ]ボタンをクリックします。
  • Mavenを使用して* leaveServiceプロジェクト*が作成されたプロジェクトの場所を選択します。
  • [完了]ボタンをクリックします。

プロジェクトを実行する

ソースファイルと構成ファイルの作成が完了したら、アプリケーションをエクスポートします。 アプリケーションを右クリックし、[エクスポート]→[WARファイル]オプションを使用し、leaveService.warファイルをTomcatのwebappsフォルダーに保存します。

Tomcatサーバーを起動し、標準ブラウザーを使用してwebappsフォルダーから他のWebページにアクセスできることを確認します。 URL-http://localhost:8080/leaveService/leave.wsdlにアクセスしてみてください。SpringWebアプリケーションですべて問題なければ、次の画面が表示されます。

最初のアプリケーション結果

Spring WS-静的WSDL

前の章のリンク:/springws/springws_first_application [Spring -WS-First Application]では、Spring WS設定を使用してWSDLを自動的に生成しました。 この場合、Spring WSを使用して既存のWSDLを公開する方法を表示します。

Step Description
1 Create a project with a name leaveService under a package com.finddevguides as explained in the Spring WS - First Application chapter.
2 Create a WSDL leave.wsdl under the/WEB-INF/wsdl sub-folder.
3 Update spring-ws-servlet.xml under the/WEB-INF sub-folder. We are using the static-wsdl tag here instead of the dynamic-wsdl.
4 The final step is to create content of all source and configuration files and export the application as explained below.

===/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://finddevguides.com/hr/schemas"
   xmlns:tns = "http://finddevguides.com/hr/definitions"
   targetNamespace = "http://finddevguides.com/hr/definitions">

   <wsdl:types>
      <xsd:schema xmlns:xsd = "http://www.w3.org/2001/XMLSchema">
         <xsd:import namespace = "http://finddevguides.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.finddevguides.hr"/>
   <sws:annotation-driven/>
   <sws:static-wsdl id = "leave" location = "/WEB-INF/wsdl/leave.wsdl"/>
</beans>

プロジェクトを実行する

ソースファイルと構成ファイルの作成が完了したら、アプリケーションをエクスポートする必要があります。 アプリケーションを右クリックして、エクスポート→WARファイルオプションを使用し、leaveService.warファイルをTomcatのwebappsフォルダーに保存します。

次に、Tomcatサーバーを起動し、標準ブラウザーを使用してwebappsフォルダーから他のWebページにアクセスできることを確認します。 URL-http://localhost:8080/leaveService/leave.wsdlにアクセスしてみてください。SpringWebアプリケーションで問題がなければ、次の画面が表示されます。

静的WSDL結果

Spring WS-サーバーの作成

この章では、Spring WSを使用してWebアプリケーションサーバーを作成する方法を理解します。

Step Description
1 Create a project with a name countryService under a package com.finddevguides as explained in the Spring WS - First Application chapter.
2 Create countries.xsd, domain classes, CountryRepository and CountryEndPoint as explained in the following steps.
3 Update spring-ws-servlet.xml under the/WEB-INF sub-folder.
4 The final step is to create content for all the source and configuration files and export the application as explained below.

countrys.xsd

<xs:schema xmlns:xs = "http://www.w3.org/2001/XMLSchema"
   xmlns:tns = "http://finddevguides/schemas"
   targetNamespace = "http://finddevguides/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>

プロジェクトを作成する

コマンドコンソールを開き、C:\ MVNディレクトリに移動して、次の mvn コマンドを実行します。

C:\MVN>mvn archetype:generate -DarchetypeGroupId = org.springframework.ws
-DarchetypeArtifactId = spring-ws-archetype -DgroupId = com.finddevguides
-DartifactId = countryService

Mavenは処理を開始し、完全なJavaアプリケーションプロジェクト構造を作成します。

[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] Using property: groupId = com.finddevguides
[INFO] Using property: artifactId = countryService
Define value for property 'version':  1.0-SNAPSHOT: :
[INFO] Using property: package = com.finddevguides
Confirm properties configuration:
groupId: com.finddevguides
artifactId: countryService
version: 1.0-SNAPSHOT
package: com.finddevguides
 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.finddevguides
[INFO] Parameter: packageName, Value: com.finddevguides
[INFO] Parameter: package, Value: com.finddevguides
[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] ------------------------------------------------------------------------

C:/MVNディレクトリに移動します。 countryService(artifactIdで指定)という名前で作成されたJavaアプリケーションプロジェクトが表示されます。 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.finddevguides.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>

ドメインクラスを作成する

C:\ mvn \ countryService \ src \ main \ resourcesフォルダーにcountrys.xsdをコピーします。 コマンドコンソールを開き、C:\ mvn \ countryService \ src \ main \ resourcesディレクトリに移動し、以下の xjc コマンドを実行して、countries.xsdを使用してドメインクラスを生成します。

C:\MVN\countryService\src\main\resources>xjc -p com.finddevguides countries.xsd

Mavenが処理を開始し、com.finddevguidesパッケージにドメインクラスを作成します。

parsing a schema...
compiling a schema...
com\finddevguides\Country.java
com\finddevguides\Currency.java
com\finddevguides\GetCountryRequest.java
com\finddevguides\GetCountryResponse.java
com\finddevguides\ObjectFactory.java
com\finddevguides\package-info.java

C:\ mvn \ countryService \ src \ mainフォルダーにフォルダーjavaを作成します。 C:\ mvn \ countryService \ src \ main \ javaフォルダー内のすべてのクラスをコピーします。 CountryRepositoryとCountryEndPointを作成して、国データベースと国サーバーをそれぞれ表します。

CountryRepository.java

package com.finddevguides;

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.finddevguides.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.finddevguides.Country;
import com.finddevguides.CountryRepository;
import com.finddevguides.GetCountryRequest;
import com.finddevguides.GetCountryResponse;

@Endpoint
public class CountryEndPoint {
   private static final String NAMESPACE_URI = "http://finddevguides/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.finddevguides"/>
   <sws:annotation-driven/>

   <sws:dynamic-wsdl id="countries"
      portTypeName = "CountriesPort"
      locationUri = "/countryService/"
      targetNamespace = "http://finddevguides.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>finddevguides 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>

プロジェクトを構築する

コマンドコンソールを開きましょう。 C:\ MVN \ countryServiceディレクトリに移動し、次の mvn コマンドを実行します。

C:\MVN\countryService>mvn clean package

Mavenはプロジェクトの構築を開始します。

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

プロジェクトを実行する

ソースファイルと構成ファイルを作成したら、TomcatのwebappsフォルダーにcountryService.warファイルをエクスポートします。

次に、Tomcatサーバーを起動し、標準ブラウザーを使用してwebappsフォルダーから他のWebページにアクセスできるかどうかを確認します。 URL(http://localhost:8080/countryService/)に対してPOST要求を行い、SOAPクライアントを使用して次の要求を行います。

<x:Envelope xmlns:x = "http://schemas.xmlsoap.org/soap/envelope/"
   xmlns:tns = "http://finddevguides/schemas">
   <x:Header/>
   <x:Body>
      <tns:getCountryRequest>
         <tns:name>United States</tns:name>
      </tns:getCountryRequest>
   </x:Body>
</x:Envelope>

次の結果が表示されます。

<SOAP-ENV:Envelope xmlns:SOAP-ENV = "http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP-ENV:Header/>
   <SOAP-ENV:Body>
      <ns2:getCountryResponse xmlns:ns2 = "http://finddevguides/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>

Spring WS-単体テストサーバー

この章では、Spring WSを使用して作成されたWebアプリケーションサービスを単体テストする方法を理解します。

Step Description
1 Update project countryService created in the Spring WS – Write Server chapter. Add src/test/java folder.
2 Create CustomerEndPointTest.java under the – src/test/java/com/finddevguides/ws folder and then update the POM.xml as detailed below.
3 Add spring-context.xml under the src/main/resources sub-folder.
4 The final step is to create content for all the source and configuration files and test the application as explained below.

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.finddevguides</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.finddevguides"/>
   <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.finddevguides.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://finddevguides/schemas'>"+
         "<name>United States</name>"+
         "</getCountryRequest>");
      Source responsePayload = new StringSource(
         "<getCountryResponse xmlns='http://finddevguides/schemas'>" +
         "<country>" +
         "<name>United States</name>"+
         "<population>46704314</population>"+
         "<capital>Washington</capital>"+
         "<currency>USD</currency>"+
         "</country>"+
         "</getCountryResponse>");
      mockClient.sendRequest(withPayload(requestPayload)).andExpect(payload(responsePayload));
   }
}

プロジェクトを構築する

コマンドコンソールを開き、C:\ MVN \ countryServiceディレクトリに移動して、次のmvnコマンドを実行します。

C:\MVN\countryService>mvn test

Mavenはプロジェクトの構築とテストを開始します。

[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.finddevguides.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.finddevguides
.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] ------------------------------------------------------------------------

Spring WS-ライティングクライアント

この章では、Spring WSを使用して、リンク:/springws/springws_write_server [Spring WS-Writing Server]で作成されたWebアプリケーションサーバーのクライアントを作成する方法を学びます。

Step Description
1 Update the project countryService under the package com.finddevguides as explained in the Spring WS – Writing Server chapter.
2 Create CountryServiceClient.java under the package com.finddevguides.client and MainApp.java under the package com.finddevguides as explained in the following steps.

CountryServiceClient.java

package com.finddevguides.client;

import org.springframework.ws.client.core.support.WebServiceGatewaySupport;
import com.finddevguides.GetCountryRequest;
import com.finddevguides.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.finddevguides;

import org.springframework.oxm.jaxb.Jaxb2Marshaller;
import com.finddevguides.client.CountryServiceClient;

public class MainApp {
   public static void main(String[] args) {
      CountryServiceClient client = new CountryServiceClient();
      Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
      marshaller.setContextPath("com.finddevguides");
      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());
   }
}

Webサービスを開始する

Tomcatサーバーを起動し、標準ブラウザーを使用してwebappsフォルダーから他のWebページにアクセスできることを確認します。

Webサービスクライアントのテスト

Eclipseの下のアプリケーションでMainApp.javaを右クリックし、「Javaアプリケーションとして実行」コマンドを使用します。 アプリケーションで問題がなければ、次のメッセージが出力されます。

Country : United States
Capital : Washington
Population : 46704314
Currency : USD

ここでは、SOAPベースのWebサービス用のクライアント- CountryServiceClient.java を作成しました。 MainAppは、CountryServiceClientを使用してWebサービスにヒットし、ポストリクエストを行い、データを取得します。

Spring WS-単体テストクライアント

この章では、link:/springws/springws_write_client [Spring WS-Writing Client]の章で作成されたWebアプリケーションサーバーのユニットテストをユニットテストする方法について説明します。 Spring WSを使用します。

Step Description
1 Update the project countryService under the package com.finddevguides as explained in the Spring WS - Writing Server chapter.
2 Create CountryServiceClientTest.java under the package com.finddevguides under folder SRC → Test → Java as explained in steps given below.

CountryServiceClientTest.java

package com.finddevguides;

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.finddevguides.client.CountryServiceClient;

public class CountryServiceClientTest {
   CountryServiceClient client;

   @Before
   public void setUp() throws Exception {
      client = new CountryServiceClient();
      Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
      marshaller.setContextPath("com.finddevguides");
      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());
   }
}

Webサービスを開始する

Tomcatサーバーを起動し、標準ブラウザーを使用してwebappsフォルダーから他のWebページにアクセスできることを確認します。

単体テストWebサービスクライアント

コマンドコンソールを開き、C:\ MVN \ countryServiceディレクトリに移動して、次のmvnコマンドを実行します。

C:\MVN\countryService>mvn test

Mavenはプロジェクトの構築とテストを開始します。

[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.finddevguides.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.finddevguides]
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.457 sec
Running com.finddevguides.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.finddevguides
.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] ------------------------------------------------------------------------