Java SEのWebサービス、パート2:SOAPWebサービスの作成

JAX-WSはSOAPベースのWebサービスをサポートしています。Java SE Webサービスに関するこの4部構成のシリーズのパート2は、SOAPベースのユニット変換Webサービスを定義し、デフォルトの軽量HTTPサーバー(パート1で説明)を介してこのWebサービスをローカルで構築および検証し、サービスのWSDLドキュメントを解釈します。 、および単純なクライアントからサービスにアクセスします。

単位変換Webサービスの定義

私がUCと名付けた単位変換Webサービスは、センチメートルとインチの間、および華氏と摂氏の間で変換するための4つの関数で構成されています。この例は単一のJavaクラスとして設計することもできますが、JavaインターフェースおよびJavaクラスとして設計することにより、ベストプラクティスに従うことを選択しました。リスト1は、WebサービスのUCインターフェースを示しています。

リスト1.UCWebサービスのサービスエンドポイントインターフェイス

package ca.javajeff.uc; import javax.jws.WebMethod; import javax.jws.WebService; @WebService public interface UC { @WebMethod double c2f(double degrees); @WebMethod double cm2in(double cm); @WebMethod double f2c(double degrees); @WebMethod double in2cm(double in); }

UCは、サービスエンドポイントインターフェイス(SEI)について説明します。これは、抽象的なJavaメソッドの観点からWebサービスインターフェイスの操作を公開するJavaインターフェイスです。クライアントは、SEIを介してSOAPベースのWebサービスと通信します。

UC@WebServiceアノテーションを介してSEIであると宣言されます。Javaインターフェースまたはクラスに注釈が付けられている@WebService場合public、パラメーター、戻り値、および宣言された例外がJAX-RPC1.1仕様のセクション5で定義されているルールに従うすべてのメソッドはWebサービス操作を記述します。唯一のためpublicの方法は、インターフェース内で宣言することができ、public予約語は、宣言時に不要であるc2f()cm2in()f2c()、およびin2cm()。これらのメソッドは暗黙的にpublicです。

各メソッドにも注釈が付けられてい@WebMethodます。が、@WebMethodこの例では必須ではないが、その存在は、アノテーション付きメソッドがWebサービス操作を公開しているという事実を強調しています。

リスト2は、WebサービスのUCImplクラスを示しています。

リスト2.UCWebサービスのサービス実装Bean

package ca.javajeff.uc; import javax.jws.WebService; @WebService(endpointInterface = "ca.javajeff.uc.UC") public class UCImpl implements UC { @Override public double c2f(double degrees) { return degrees * 9.0 / 5.0 + 32; } @Override public double cm2in(double cm) { return cm / 2.54; } @Override public double f2c(double degrees) { return (degrees - 32) * 5.0 / 9.0; } @Override public double in2cm(double in) { return in * 2.54; } }

UCImplSEIの実装を提供するサービス実装Bean(SIB)について説明します。このクラスは、@WebService(endpointInterface = "ca.javajeff.uc.UC")アノテーションを介してSIBであると宣言されています。このendpointInterface要素は、このSIBをそのSEIに接続し、後で説明するクライアントアプリケーションを実行するときに未定義のポートタイプエラーを回避するために必要です。

このimplements UC条項は絶対に必要というわけではありません。この句が存在しない場合、UCインターフェイスは無視されます(冗長です)。ただし、implements UCコンパイラがSEIのメソッドがSIBに実装されていることを確認できるように、保持することをお勧めします。

@WebMethodこの注釈は通常SEIのコンテキストで使用されるため、SIBのメソッドヘッダーには注釈が付けられません。ただし、publicメソッド(JAX-RPC 1.1仕様のセクション5のルールに準拠)をSIBに追加する場合、このメソッドがWebサービス操作を公開しない場合は、メソッドヘッダーに注釈を付けます@WebMethod(exclude = true)。割り当てることによってtrueまで@WebMethodexclude要素には、操作に関連しているから、その方法を防ぎます。

このWebサービスは、クライアントからアクセスできるように公開する準備ができています。リスト3はUCPublisher、デフォルトの軽量HTTPサーバーのコンテキストでこのタスクを実行するアプリケーションを示しています。

リスト3.UCの公開

import javax.xml.ws.Endpoint; import ca.javajeff.uc.UCImpl; public class UCPublisher { public static void main(String[] args) { Endpoint.publish("//localhost:9901/UC", new UCImpl()); } }

Webサービスの公開には、EndPointクラスのEndpoint publish(String address, Object implementor)クラスメソッドへの単一の呼び出しが含まれます。このaddressパラメーターは、Webサービスに割り当てられたURIを識別します。localhost(IPアドレス127.0.0.1に相当)とポート番号9901(おそらく利用可能)を指定して、このWebサービスをローカルホストに公開することを選択しました。また、/UC公開パスとして任意に選択しました。このimplementorパラメーターは、UCのSIBのインスタンスを識別します。

publish()この方法は、作成し、指定のエンドポイント発行してimplementor与えられた時のオブジェクトをaddress、そして使用するimplementorWebサービス定義言語(WSDL)およびXMLスキーマ文書を作成するための注釈を。これにより、必要なサーバーインフラストラクチャが、いくつかのデフォルト構成に基づいてJAX-WS実装によって作成および構成されます。さらに、このメソッドにより、アプリケーションは無期限に実行されます。(Windowsマシンでは、CtrlキーとCキーを同時に押して、アプリケーションを終了します。)

Webサービスの構築と検証

以前に定義したUCWebサービスを構築することは難しくありません。まず、適切なファイルを含む適切なディレクトリ構造を作成する必要があります。次の手順を実行して、このタスクを実行します。

  1. 現在のディレクトリ内に、ディレクトリを作成しますca。内caに、javajeffディレクトリを作成します。最後に、内javajeffucディレクトリを作成します。
  2. リスト1をUC.javaソースファイルにコピーし、このファイルをに保存しますca/javajeff/uc
  3. リスト2をUCImpl.javaソースファイルにコピーし、このファイルをに保存しますca/javajeff/uc
  4. リスト3をUCPublisher.javaソース・ファイルにコピーし、このファイルをディレクトリーを含む現在のディレクトリーに保管してcaください。

次のタスクは、これらのソースファイルをコンパイルすることです。ディレクトリを変更していないと仮定して、次のコマンドを実行して、これらのソースファイルをJava SE 9でコンパイルします(--add-modules java.xml.wsJava SE 6、7、または8では省略)。

javac --add-modules java.xml.ws UCPublisher.java

これらのソースファイルが正常にコンパイルされた場合は、次のコマンドを実行して、このアプリケーションをJava 9で実行します(--add-modules java.xml.wsJava SE 6、7、または8では省略)。

java --add-modules java.xml.ws UCPublisher

アプリケーションの実行中に、Webブラウザーを使用して、このWebサービスが正しく実行されていることを確認し、WSDLドキュメントにアクセスします。お気に入りのWebブラウザを起動し、アドレスバーに次の行を入力します。

//localhost:9901/UC

図1は、Google ChromeWebブラウザーで結果のWebページを示しています。

図1.UCのWebページは、公開されたWebサービスに関する詳細情報を提供します

図1は、Webサービスエンドポイントの修飾されたサービスとポート名を示しています。(パッケージ名が逆になっていることに注意してください-uc.javajeff.caではなくca.javajeff.uc)。クライアントはこれらの名前を使用してサービスにアクセスします。

図1は、WebサービスのアドレスURI、WebサービスのWSDLドキュメントの場所(?wsdlクエリ文字列が付加されたWebサービスURI )、およびWebサービス実装クラスのパッケージ修飾名も示しています。

WebサービスのWSDLドキュメントの解釈

UCWebサービスのWSDLドキュメントの場所がリンクとして表示されます。このリンクをクリックして、リスト4に内容を示すWSDLドキュメントを表示します。

リスト4.UCのWSDLドキュメント

WSDL文書は持つXML文書でdefinitions定義のセットよりも多くのWSDLドキュメントは何も行いませんルート要素、。この要素は、様々含むxmlnsと共に、種々の標準的な名前空間を識別するための属性targetNameSpacename属性:

  • このtargetNamespace属性は、WSDLドキュメント内のすべてのユーザー定義要素(この名前の要素をc2f介して定義された要素など)の名前空間を作成しますmessage。この名前空間は、現在のWSDLドキュメントのユーザー定義要素とインポートされたWSDLドキュメントのユーザー定義要素を区別するために使用されます。これらはWSDLのimport要素を介して識別されます。同様targetNamespaceに、XMLスキーマベースのファイルのschema要素に表示される属性は、ユーザー定義の単純型要素、属性要素、および複合型要素の名前空間を作成します。
  • このname属性はWebサービスを識別し、サービスを文書化するためにのみ使用されます。

内にネストdefinitionsされているtypesmessageportTypebinding、およびservice要素: