9.20. ツール

JBossWS で提供される JAX-WS ツールはさまざまな方法で使用することができます。 まず、 サーバー側デプロイメントについて考察してからクライアントを見ていきます。 Web Service Endpoint (サーバー側) を開発する場合、 Java (bottom-up 開発) から開始するか、 サービスを定義する抽出コントラクト (WSDL) から開始するか (top-down 開発) を選択するオプションがあります。 これが新しいサービスなら (既存コントラクトがない) bottom-up の方が時間的に早くなり、 サービスが正しく起動して実行するようクラスにいくつかアノテーションを追加するだけになります。 しかし、 既に定義されているコントラクトがあるサービスを開発する場合は、 提供されているツールがアノテーション付きコードを生成するため top-down の方法を選択した方がずっと簡単になります。
Bottom-up を使用した場合:
  • すでに存在する EJB3 bean を Web Service として公開
  • 新しいサービスを提供する、 コントラクトの生成が必要
Top-down を使用した場合:
  • 旧式クライアントとの互換性を維持しながら既存 Web サービスの実装を置き換える
  • サードパーティによって指定されるコントラクトに適合するサービスを公開する (例:定義済みのプロトコルを使ってコールバックを行うベンダー)
  • 前もって手動で開発した WSDL と XML スキーマを厳守するサービスを作成する
次の JAX-WS コマンドラインツールが JBossWS に含まれています。
コマンド
内容
移植性のある JAX-WS アーチファクトを生成し、 抽象規定を提供します。 bottom-up 開発で使用されます。
抽象規定 (SWDL と Schema ファイル) を摂取して、 サーバーおよびクライアントの両方にアーチファクトを生成します。 top-down およびクライアント開発に使用されます。
JBossWS クラスパスを使って Java クライアント (1 つの main メソッドを持つ) を実行します。 

9.20.1. Bottom-Up (wsprovide を使用)

bottom-up の方法では使用するサービスに Java コードを開発してそれに JAX-WS アノテーションを付ける必要があります。 これらのアノテーションはサービス用に生成されるコントラクトのカスタマイズに使用できます。 たとえば、 マッピングするオペレーション名は何にしても構いません。 しかし、 アノテーションはすべて目的に合ったデフォルトを持つので、 @WebService アノテーションのみが必要になります。
次のように単一クラスを作成するなどできるだけシンプルにすることができます。
package echo;
  
@javax.jws.WebService
public class Echo
{
   public String echo(String input)
   {
      return input;
   }
}
JSE または EJB3 のデプロイメントはこのクラス使って構築することができるため、 JBossWS にデプロイが必要となる Java コードはこれのみになります。 WSDL および「ラッパークラス」と呼ばれるその他すべての Java アーチファクトはデプロイ時にユーザーによって生成されます。 これは JAX-WS の仕様外で、 オフラインツールを使用したラッパークラスの生成が必要となります。 これはベンダーの実装問題に対処するためで、開発者に対して一連の追加ステップによる負担をかけないようにするため生成しています。 ただし、 他のアプリケーションサーバーに対しても移植性のあるデプロイメントにしたい場合は、 ツールを使って生成されるクラスを追加する必要があります。
これが wsprovide ツールの主要な目的となり、 移植性のある JAX-WS アーチファクトを生成します。 さらに、 サービスに抽象規定 (WSDL ファイル) を「提供」するために使用することもできます。 「-w」オプションを使って wsprovide を呼び出して、これを取得することができます。
$ javac -d . -classpath jboss-jaxws.jar Echo.java
$ wsprovide -w echo.Echo
Generating WSDL:
EchoService.wsdl
Writing Classes:
echo/jaxws/Echo.class
echo/jaxws/EchoResponse.class
WSDL をよく見てみると EchoService という名前のサービスがわかります。
<service name='EchoService'>
   <port binding='tns:EchoBinding' name='EchoPort'>
      <soap:address location='REPLACE_WITH_ACTUAL_URL'/>
   </port>
</service>
期待通り、 このサービスはあるオペレーション、 「echo」を定義しています。
<portType name='Echo'>
   <operation name='echo' parameterOrder='echo'>
      <input message='tns:Echo_echo'/>
      <output message='tns:Echo_echoResponse'/>
   </operation>
</portType>

注記

JBossWS の開発時にはこのツールを実行する必要はないことを念頭においてください。 これは、 移植性のあるアーチファクトやサービス用の抽象規定を生成する場合にのみ必要になります。
JBoss Enterprise Application Platform 上にデプロイメントに対する POJO エンドポイントを作成してみましょう。 簡単な 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">
  
   <servlet>
      <servlet-name>Echo</servlet-name>
      <servlet-class>echo.Echo</servlet-class>
   </servlet>
  
   <servlet-mapping>
      <servlet-name>Echo</servlet-name>
      <url-pattern>/Echo</url-pattern>
   </servlet-mapping>
</web-app>
これで web.xml および単一クラスを使用して WAR を作成できるようになりました。
$ mkdir -p WEB-INF/classes
$ cp -rp echo WEB-INF/classes/
$ cp web.xml WEB-INF
$ jar cvf echo.war WEB-INF
added manifest
adding: WEB-INF/(in = 0) (out= 0)(stored 0%)
adding: WEB-INF/classes/(in = 0) (out= 0)(stored 0%)
adding: WEB-INF/classes/echo/(in = 0) (out= 0)(stored 0%)
adding: WEB-INF/classes/echo/Echo.class(in = 340) (out= 247)(deflated 27%)
adding: WEB-INF/web.xml(in = 576) (out= 271)(deflated 52%)
次に war をデプロイします。
 cp echo.war <replaceable>$JBOSS_HOME</replaceable>/server/default/deploy
JBossWS はデプロイ時に内部的に wsprovide を呼び出し、 WSDL を生成します。 デプロイメントに成功すれば、 デフォルトの設定を使用していることになり、 http://localhost:8080/echo/Echo?wsdl にあるはずです。
移植性のある JAX-WS デプロイメントの場合、 先に生成されるラッパークラスをデプロイメントに追加することができます。