1.2.4. WSDLやXML書式からのWebサービスの作成

ここでは、WSDLや XML から Web サービスを作成する方法について説明します。

1.2.4.1. WSDL、XMLスキーマの作成

ここでは、Webサービスの作成に必要なWSDLファイルやXMLファイルの作成について説明します。
WSDLファイルの作成
WebOTX Developer's Studioのメニュー ファイル > 新規 > その他を選択すると、 新規ダイアログが起動します。
WSDLファイルを作成するには、Web サービス > WSDL Fileを選択し、次へ をクリック。


図1.2.4.1-1

WSDLファイルの生成先を選択し、ファイル名 に生成するWSDLのファイル名を入力します。
入力が完了したら次へ をクリック。


図1.2.4.1-2

生成するWSDLファイルの基本の内容を設定します。
設定が完了したら完了 をクリックしてWSDLファイルを生成します。


図1.2.4.1-3

XMLファイルの生成
WebOTX Developer's Studioのメニューファイル > 新規 > その他を選択すると、 新規ダイアログが起動します。
XMLファイルを作成するには、XML > XML ファイルを選択し、次へ をクリック。


図1.2.4.1-4

XMLファイルの生成先を選択し、ファイル名 に生成するXMLのファイル名を入力します。
入力が完了したら完了 をクリック。


図1.2.4.1-5

1.2.4.2. JAX-WS(ウィザード)

ここでは、Webサービス作成ウィザードを使用してWSDLファイルから JAX-WS準拠のWebサービスを作成する方法について説明します。
初期設定や起動方法については、[1.2.2. Webサービスの作成]を参照してください。
Webサービス
プロジェクト名にWebサービスを生成するプロジェクトの名前を指定します。カレントワークスペースにある既存のプロジェクト又は新規に作成するプロジェクト名を指定できます。プロジェクトは、デフォルトでは
<WebOTX_DIR>\Studio\workspace\指定したプロジェクト名
というフォルダに作成されます。もし、別の場所に作成したい場合は、 デフォルトロケーションの使用をOFFにして、任意の場所を絶対パスで指定します。
Webサービス仕様JAX-WSを選択。
WSDLから作成 を選択し、Webサービスの元となるWSDLファイルを指定します。
以上の設定を終了したら、次へ をクリック。


図1.2.4.2-1

Caution
指定したプロジェクトにウィザードで作成したWebサービスが既に存在している場合、Webサービスを生成することができません。

Caution
プロジェクトには動的WebプロジェクトとEJBプロジェクト のみを指定できます。

Memo
プロジェクト名に含めてはいけない文字を含めると、エラーメッセージが表示されます。

Memo
<WebOTX_DIR>はWebOTXのインストールルートディレクトリのことです。

Webサービスの実装形式選択
Webサービスを実装する形式を選択します。選択したら、次へをクリック。


図1.2.4.2-2

Memo
Webアプリケーションを選択した場合、動的Webプロジェクトを生成します。EJBを選択した場合、EJB プロジェクトを生成します。

ここでWebサービスの作成を開始できます
完了 をクリックすると、Webサービスの作成を開始します。


図1.2.4.2-3

Caution
WSDLファイル中で別のファイルをインポートした場合、インポートされるファイルを<ワークスペース>\<プロジェクト>\WebContent\WEB-INF\wsdl\フォルダ手動的にコピーする必要があります。コピー先は、wsdl フォルダをルートにしての相対パス上にコピーします。
例えば、
--------wsdl ファイル--------

  <types>
    <xsd:schema>
    <xsd:import namespace=http://packagename/
      schemaLocation="ext/TestServiceService_schema1.xsd"/>
    </xsd:schema>
  </types>

--------wsdl ファイル--------
「TestServiceService_schema1.xsd」ファイルをwsdl/ext フォルダ配下にコピーします。

Memo
ファイルをインポートできるタグは以下の通りです: wsdl:import
xsd:import
xsd:include

Memo
コピー後、WSDLファイルの解析エラーが解消されない場合は、WSDLファイルの右クリックメニュー 検証 を選択してください。

ビジネスロジックの実装
作成されたプロジェクトに生成された javaソースのうち、「*Impl.java」 のjavaソースが生成されます。
ロジックを実装する部分になりますので、このクラスにロジックを実装します。

Memo
ロジックを作成する際に、アノテーションエディタを使用するとアノテーションの入力が簡単に行えます。アノテーションエディタについては、[ アプリケーション開発ガイド(共通) > 8. アノテーション定義支援ツール ]を参照して下さい。


1.2.4.3. JAX-WS(コマンド)

サーバアプリケーションを作成するには次の2通りの方法があります。

1.2.4.4. JAX-RPC(コマンド)

Memo
JAX-RPCは旧互換のための機能です。


JAX-RPCランタイムを使用したWebサービスをWSDLからwscompileコマンドを使用して作成する方法を説明します。
準備
WebOTX Developer をお持ちの場合、WebOTX Developer を起動します。WebサービスをWebアプリケーションとして実装する場合は「Dynamic Web Project」を、WebサービスをEJBとして実装する場合は「EJB Project」を作成します。次に、作成したプロジェクトに次のクラスパスを追加します。

Memo
「\」はWindowsのパス区切り文字です。UNIXでは「/」に読み替えてください。

Memo
<WebOTX_DIR>はWebOTXのインストールルートフォルダ(ディレクトリ)です。

WebOTX Developerをお持ちでない場合、任意の空のフォルダ(ディレクトリ)を作成してWSDLを置き、環境変数に次の変数を追加します。

PATH変数に追加する

CLASSPATH変数に追加する

Memo
<J2SE_DIR>はJ2SESDKのインストールルートフォルダ(ディレクトリ)です。

設定ファイルの作成
先に作ったプロジェクトのルートフォルダ、または任意のフォルダに次の内容のXMLファイルを作成します。
<?xml version="1.0" encoding="UTF-8" ?>
<configuration xmlns="http://java.sun.com/xml/ns/jax-rpc/ri/config">
 <wsdl location="WSDLファイル名" packageName="生成するクラスのパッケージ名" />
</configuration>
wscompileコマンドの実行
次のようにwscompileコマンドを実行し、WSDLからWebサービス作成に必要なクラスを生成します。wscompileコマンドオプションの詳細については「1.2.12.4. wscompile」を参照してください。
[foo@webotx ~]$ wscompile -gen:server -d クラスファイル出力先 -s ソースコード出力先 -keep 設定ファイル名
ビジネスロジック/EJBの作成
WebアプリケーションとしてWebサービスを実装するときのビジネスロジックは、サービスエンドポイントインタフェースをimplementsすることで作成します。サービスエンドポイントインタフェースは、wscompileコマンドにより生成されたクラスに含まれており、java.rmi.Remoteを継承したインタフェースクラスです。

EJBとしてWebサービスを実装するときのビジネスロジックは、EJBです。EJBは「javax.ejb.SessionBean」をimplementsしたクラスです。EJBの中にサービスエンドポイントインタフェースで定義されたメソッドを実装することで、Webサービスのビジネスロジックは完成します。
Webアプリケーションとして実装する場合の配備記述子
web.xmlを作成します。
<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://java.sun.com/xml/ns/javaee" 
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
version="3.0">
  <servlet>
    <servlet-name>任意のサーブレット名</servlet-name>
    <servlet-class>ビジネスロジックのクラス名(パッケージ名つき)</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>任意のサーブレット名</servlet-name>
    <url-pattern>/ビジネスロジックに関連付けるURL</url-pattern>
  </servlet-mapping>
</web-app>

servlet-name要素では任意のサーブレット名を記述します。servlet要素とservlet-mapping要素にそれぞれservlet-name要素がありますが、サーブレット名は同じにしなければなりません。

url-pattern要素では、WSDLのaddress要素のlocation属性に指定したURLの一部を記述します。必ず「/」から書き始めることに注意してください。また、コンテキストルートではないことに注意してください。「/*」を指定することは他のサーブレットとの共存とセキュリティの観点から推奨されません。

(例1)http://host/a/b の場合「/b」と記述します。
(例2)http://host/a/b/cの場合「/b/c」と記述します。

次に、webservices.xmlを作成します。
<?xml version="1.0" encoding="UTF-8" ?>
<webservices xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  http://java.sun.com/xml/ns/javaee/javaee_web_services_1_2.xsd" version="1.2">
  <webservice-description>
    <webservice-description-name>Web サービス名(WSDLを参照)</webservice-description-name>
    <wsdl-file>WSDL ファイルのURL(相対パス)</wsdl-file>
    <jaxrpc-mapping-file>WSEE マッピングファイルのURL(相対パス)</jaxrpc-mapping-file>
    <port-component>
      <port-component-name>任意のポートコンポーネント名</port-component-name>
      <wsdl-port xmlns:ns="ポートの名前空間URI">ns:ポート名</wsdl-port>
      <service-endpoint-interface>サービスエンドポイントクラス名</service-endpoint-interface>
      <service-impl-bean>
        <servlet-link>任意のサーブレット名</servlet-link>
      </service-impl-bean>
    </port-component>
  </webservice-description>
</webservices>

webservice-description-name要素にはWSDLで指定したWebサービス名を記述します。1つのWSDLに複数のWebサービスが定義されたとき、webservices要素には複数のwebservice-description要素を記述することができます。このとき、webservice-description-name要素の値はユニークでなければなりません。一般的には、間違いを防止するために、webservice-description-name要素にはWSDLのservice要素のname属性の値を指定します。

wsdl-file要素には参照するWSDLのロケーションをWARファイルのルートから始まる相対パスで「WEB-INF/wsdl/sample.wsdl」のように指定します。一般的には、WSDLは他の配備記述子と同じ扱いをするため、WEB-INFフォルダの配下に置きます。

jaxrpc-mapping-file要素には参照するWSEEマッピングファイルのロケーションをWARファイルのルートから始まる相対パスで「WEB-INF/mapping.xml」のように指定します。

port-component要素には、1つのポートについて、WSDLに指定されたportに対するサービスエンドポイントインタフェースとビジネスロジックを関連付けます。port-component-name要素には任意の「port名」を指定します。1つのWSDLに複数のportが定義されたとき、webservice-description要素には複数のport-component要素を記述することができます。このとき、この値がユニークになるように注意しなければなりません。一般的には、間違いを防止するために、WSDLのport要素のname属性の値を指定します。

wsdl-port要素には、WSDLで指定されているportを名前空間URIとローカル名で示します。xmlns: ns属性の値に名前空間URIを指定します。この値は、WSDLのtargetNamespaceに定義されています。また、ローカル名を「ns:ローカル名」のように指定します。この値は、WSDLのport要素のname属性の値として定義されています。

service-endpoint-interface要素にはサービスエンドポイントインタフェースのクラス名(パッケージ名つき)を指定します。

service-impl-bean要素ではWebサービスのビジネスロジックを関連付けます。ここではサーブレットに関連付けるために、「servlet-link」という要素を使い、servlet-link要素に、web.xmlのservlet-name要素で指定したサーブレット名を記述します。
EJBとして実装する場合の配備記述子
ejb-jar.xmlを作成します。
<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:xml="http://www.w3.org/XML/1998/namespace"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd" version="3.1">
  <description xml:lang="ja">任意のEJBアーカイブ名</description>
  <enterprise-beans>
    <session>
      <ejb-name>任意のEJB名</ejb-name>
      <service-endpoint>サービスエンドポイントインタフェースクラス名</service-endpoint>
      <ejb-class>EJB クラス名</ejb-class>
      <session-type>Stateless</session-type>
      <transaction-type>Container</transaction-type>
       <security-identity>
         <use-caller-identity/>
      </security-identity>
    </session>
  </enterprise-beans>
</ejb-jar>
service-encpoint要素には、サービスエンドポイントインタフェースのクラス名をパッケージ名つきで記述します。

ejb-class要素には、EJBクラス名をパッケージ名つきで記述します。

次に、webservices.xmlを作成します。
<?xml version="1.0" encoding="UTF-8"?>
<webservices xmlns="http://java.sun.com/xml/ns/javaee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
 http://java.sun.com/xml/ns/javaee/javaee_web_services_1_2.xsd" version="1.2">
  <webservice-description>
    <webservice-description-name>Web サービス名(WSDLを参照)</webservice-description-name>
    <wsdl-file>WSDL ファイルのURL(相対パス)</wsdl-file>
    <jaxrpc-mapping-file>WSEE マッピングファイルのURL(相対パス)</jaxrpc-mapping-file>
    <port-component>
      <port-component-name>任意のポートコンポーネント名</port-component-name>
      <wsdl-port xmlns:ns="ポートの名前空間URI">ns:ポート名</wsdl-port>
      <service-endpoint-interface>サービスエンドポイントクラス名</service-endpoint-interface>
      <service-impl-bean>
        <ejb-link>任意のEJB名</ejb-link>
      </service-impl-bean>
    </port-component>
  </webservice-description>
</webservices>

webservice-description-name要素にはWSDLで指定したWebサービス名を記述します。1つのWSDLに複数のWebサービスが定義されたとき、webservices要素には複数のwebservice-description要素を記述することができます。このとき、webservice-description-name要素の値はユニークでなければなりません。一般的には、間違いを防止するために、webservice-description-name要素にはWSDLのservice要素のname属性の値を指定します。

wsdl-file要素には参照するWSDLのロケーションをWARファイルのルートから始まる相対パスで「META-INF/wsdl/sample.wsdl」のように指定します。一般的には、WSDLは他の配備記述子と同じ扱いをするため、META -INFフォルダの配下に置きます。

jaxrpc-mapping-file要素には参照するWSEEマッピングファイルのロケーションをEJB-JARファイルのルートから始まる相対パスで「mapping.xml」のように指定します。

port-component要素には、1つのポートについて、WSDLに指定されたportに対するサービスエンドポイントインタフェースとビジネスロジックを関連付けます。port-component-name要素には任意の「port名」を指定します。1つのWSDLに複数のportが定義されたとき、webservice-description要素には複数のport-component要素を記述することができます。このとき、この値がユニークになるように注意しなければなりません。一般的には、間違いを防止するために、WSDLのport要素のname属性の値を指定します。

wsdl-port要素には、WSDLで指定されているportを名前空間URIとローカル名で示します。xmlns: ns属性の値に名前空間URIを指定します。この値は、WSDLのtargetNamespaceに定義されています。また、ローカル名を「ns:ローカル名」のように指定します。この値は、WSDLのport要素のname属性の値として定義されています。

service-endpoint-interface要素にはサービスエンドポイントインタフェースのクラス名(パッケージ名つき)を指定します。

service-impl-bean要素ではWebサービスのビジネスロジックを関連付けます。ここではEJBに関連付けるために、「ejb-link」という要素を使い、ejb-link要素に、ejb-jar.xmlのejb-name要素で指定したEJB名を記述します。
アーカイブの作成
WebOTX Developerをお持ちの場合、エクスポート機能でWARファイル、またはEJB-JARファイルを作成します。WebOTX Developerをお持ちでない場合、JDKのjarコマンドを使用してWARファイル、またはEJB-JARファイルを作成します。アーカイブ内部のイメージは次のようになります。

WARファイル

   /WEB-INF/classes/<wscompileコマンドで生成したクラス、ビジネスロジック>
   /WEB-INF/wsdl/<WSDLファイル>
   /WEB-INF/web.xml
   /WEB-INF/webservices.xml
   /WEB-INF/mapping.xml

EJB-JARファイル

   /<wscompileコマンドで生成したクラス、EJB>
   /META-INF/wsdl/<WSDLファイル>
   /META-INF/ejb-jar.xml
   /META-INF/webservices.xml
   /mapping.xml

※WebOTX Developerの場合、この手順を飛ばして「サーバで実行」で実行することもできます。
配備
配備には、統合運用管理ツール、Web版運用管理ツール、運用管理パースペクティブ、運用管理コマンド(otxadmin)が使えます。各ツールの詳細は、運用編の各ツールの説明を参照してください。

なお、配備の際、コンテキストルート(WSDLのaddress要素のlocation属性に指定したURLの一部)を指定する必要があります。「/」から書き始めても、そうでなくてもかまいません。

(例1)http://host/a/b の場合「a」と指定します。
(例2)http://host/a/b/cの場合「a」と指定します。

※WebOTX Developerの場合、この手順を飛ばして「サーバで実行」で実行することもできます。