Web サービス (バージョン 4.2)

Platform version 4.2 またはそれ以前のversionが必要
4.5 またはそれ以降のversionではサポートしていない - 4.5 Web Service supportは
データサービス を参照

Web サービスは、相互運用可能なコンピュータ間のネットワーク上でのインタラクションをサポートする目的でデザインされたソフトウェア システムです。Nexaweb Platform では、サーバーサイドとクライアントサイドの両方から Web サービスを起動できます。Nexaweb では、Web サービスの使用に関して次の 2 つの特徴が利用されます。

  1. 開発段階では、どの Web サービスが使用されるか判明していません。
  2. Web サービスの使用はクライアントサイドで行われる必要があります。ただし、セキュリティ上の懸念やファイアウォールまたはネットワークの問題により、クライアントは Web サービス自体への接続を持つことができません。

詳細については、com.nexaweb.server.webservices および com.nexaweb.client.webservices パッケージ内の API ドキュメントで説明されています。
 

Web サービスを使用する 2 つの方法

通常、Web サービスはリモートコンピュータで実行されるため、この Web サービスで使用されるデータ型が事前に判明している場合と判明していない場合があります。そのため、Web サービスのデータにアクセスするには、次の 2 つの方法が使用されます。

1. 強く型付けされた方式: コンパイル時にデータ型が既にわかっている場合に使用します。コンパイル時に、強く型付けされた方法でメソッドを直接呼び出すことができます。たとえば、 api.google.com で正しいスペルの候補を表示する Web サービスを提供しているとします。このサービスが GoogleSearchPort オブジェクトをサービスポートとして返す場合は、次のようにコードを記述して直接呼び出します。

_googlePort.doSpellingSuggestion("mykey", "pirimaid"); 

この方法により、目的の単語に対する正しいスペルの候補が表示されます。

2. リフレクション方式: コンパイル時にデータ型が判明していないか、データ型をあまり問わないが、呼び出すメソッドがわかっている場合に使用します。正しいスペルの候補を表示する例では、次のようにコードを記述します。

Class[] argsType = {String.class, String.class};
Method getSpellingMethod = getMethod("doSpellingSuggestion", argsType); 
Object[] args = {"mykey", "pirimaid"}
String suggestion = (String)getSpellingMethod .invoke(_googlePortObject, args);

nexaweb-webservices.xml での Web サービスの設定

Web サービスを設定する前に、WSDL (Web Services Description Language) ドキュメントがどこにあるか知っている必要があります。WSDL は、ネットワークサービスを記述するための XML 形式による仕様です。WSDL ドキュメントはWeb サービスプロバイダから発行されています。入手方法がわからない場合は、Web サービスプロバイダにお問い合わせください。通常の場合、http://www.soapclient.com/xml/googleSearch.wsdlのような URL 形式となっています。WSDL の URL が正しいことを確認するには、使用するブラウザから目的の URL にリンクして、XML ファイルが表示されることを確認します。

次の手順では、アプリケーションの "WEB-INF" フォルダ内にある "nexaweb-webservices.xml" を作成します。次のようにエントリを追加できます。
 

<?xml version="1.0" encoding="UTF-8"?>
<web-services>
    <web-service xmlns="http://nexaweb.com/webservices"
     name="Google"
     scratchDir="{0}/WEB-INF/WebServices/{1}"
     wsdlUrl=">
</web-services>

この設定では、特定の Web サービスに使用する、次の 2 つの属性を変更するだけです。

 

  • name - Web サービスとキーに与えられた名前です。Java コードで、WebServiceBroker から Web サービス ポートを取得するために使用されます。
  • wsdlUrl - サービスを記述する WSDL ドキュメントへの URL です。これは、java.net.URL オブジェクトとして有効な完全修飾 URL でなければなりません。この属性は、"wsdlPath" 属性と共に使用することはできません。どちらか 1 つのみを指定できます。
  • scratchDir - この属性を変更する必要はありません。この属性は、java.io.File オブジェクトに対する引数として使用される java.text.MessageFormat 文字列です。WebService ソースおよびクラス ファイルのディレクトリとして順に使用されます。この MessageFormat に渡される引数は次のとおりです。
    {0} - ServletContext.getRealPath("/")、{1} - Web サービスの論理名

また、wsdlUrlでは次の設定も行われます。

  • wsdlPath - サービスを記述する WSDL ドキュメントへのパス。このパスは、Web アプリケーションのコンテキストへの相対パスです (例: /WEB-INF/weather.wsdl)。このパスは、wsdlUrl 属性と共に使用できないことに注意してください。

コンパイル時および実行時に必要な Web サービスのクラス
 

コンパイル時に必要な条件

コンパイル時にリフレクション方式を選択する場合に必要なクラスは、標準的な Nexaweb アプリケーションの開発に必要なものだけです。Web サービスのデータ型は実行時に判明します。

強く型付けされた 方式を選択する場合は、アプリケーションのコンパイルにクラスのセットが必要です。Nexaweb Platform では、このようなクラスを生成する手順のほとんどが自動化されています。ただし、これらを統合するにはいくつかの手順を手動で実行する必要があります。

これらのクラスを取り出す手順を次に示します。

  1. "nexaweb-webservices.xml" を設定して、WEB-INF フォルダにこのファイルを配置します。
  2. 強く型付けされた Web サービスのコードを記述する前にアプリケーションをデプロイします。
  3. アプリケーションを起動します。Nexaweb webservice サーブレットは、scratchDir で定義したフォルダにこれらのクラスを自動的に生成します。
  4. 上記の定義済み nexaweb-webservices.xml を使用すると、デフォルトで次のようなフォルダ構造が表示されます (まず、有効な name wsdlUrl が必要です)。
  5. この場合で指定する名前 'Google' は、これらのクラスを配置するフォルダ名として使用されます。

WEB-INF/WebServices/Google/classes

        /AxisClasses
        /ClientClasses
        /ServerClasses

/ClientClasses フォルダ内のクラスは、クライアントでコンパイルを行う際に必要です。/ServerClasses フォルダ内のクラスは、サーバーでコンパイルを行う際に必要です。この Web サービスを使用して強く型付けされた方式のコードをコンパイルする場合は、これらのクラスがクラスパスにあることを確認してください。

実行時に必要な条件

実行時に 必要な条件は、リフレクション方式および強く型付けされた方式と同じです。有効な nexaweb-webservices.xml を持つアプリケーションを起動するたびに、これらのクラスはデフォルトで一度生成されるため、これらのクラスを実行時のクラスパスに明示的に配置する必要 はありません。この点は、コンパイル時に必要な条件と異なります。コンパイル時の場合は、コードをコンパイルする前にクラスを持っていて、それらをクラス パスに最初に配置する必要があります。これにより、実行時には必ず、最新のプロキシクラスとデータ型が常に取得されます。

強く型付けされた方式のコンパイル時に必要な条件では、次のフォルダについて説明しました。
    /ClientClasses
     /ServerClasses

これらのフォルダは、使用する方式に関係なく、実行時にも必要です。また、次のようなフォルダもあります。
    /AxisClasses

このフォルダも実行時に必要になります。Axis ライブラリを使用して Web サービスのサポート用にプロキシクラスを生成する場合に使用されます。

/AxisClassesとそのサブフォルダに表示されるクラス、Axis ライブラリは予約され、実行時にNexaweb の非公開クラスローダーによってのみロードされます。その他の Axis ライブラリを使用する必要がある場合、互換性について心配する必要はありません。

次に示す Web サービスのコード例はほとんど同じで、クライアントサイドまたはサーバーサイドでの実行に適しています。注意すべき相違点は次の 2 つだけです。

1. WebServiceBroker を取得するには、サーバーサイドで次の呼び出しを行います。

    // サーバーサイドで、ServiceManager を使用してブローカーを取得します。
     WebServiceBroker broker = ServiceManager.getWebServiceBroker();

  クライアントサイドでは、次の呼び出しを行います。

   // クライアントサイドで、ClientSession を使用してブローカーを取得します。
    WebServiceBroker broker = clientSession.getWebServiceBroker();

2. サーバーサイドでコードが実行されている場合は、追加の呼び出しを行って Web サービスを検出する必要があります。

   // Web サービスの検出、Java クラスの記述、クラスのコンパイルとロードを行います。
    // この呼び出しはサーバーサイドでのみ使用できます。
    broker.createWebService( name, wsdlUrl );

また、実行時に必要なクラスがクライアントとサーバーの適切なクラスパスに生成されることを確認してください。このようなクラスを設定する必要がない場合でも同様です。

強く型付けされた方式の例

強く型付けされた方式では、実行時に必要なクラスに加え、クライアントまたはサーバーのコンパイル時に必要なクラスを使用して、コンパイル用のパスでコードをコンパイルするようにしてください。

// クライアントサイドまたはサーバーサイドのコードに基づいて、まずブローカーを取得します。
String wsdlUrl = "http://www.soapclient.com/xml/googleSearch.wsdl"
String name="GoogleWebService";

// サーバーサイドのみの呼び出し
// broker.createWebService(name, wsdlUrl);

// この呼び出しで、Web サービスのメソッドで使用可能なポートを
// 取得します。
GoogleSearchPort googlePort = (GoogleSearchPort)broker.getServicePort(name);
String pyramid = googlePort.doSpellingSuggestion("myKey", "piramid"); // ここでは、間違ったスペル'piramid' を意図的に使用します。

この例のGoogleSearchPortは強く型付けされたオブジェクトで、GoogleSearchサービスで定義されたクラスのインスタンスです。

リフレクション方式の例

// クライアントサイドまたはサーバーサイドのコードに基づいて、まずブローカーを取得します。
String wsdlUrl = "http://www.soapclient.com/xml/googleSearch.wsdl"
String name="GoogleWebService";

// サーバーサイドのみの呼び出し
// broker.createWebService(name, wsdlUrl);

// この呼び出しで、Web サービスのメソッドで使用可能なポートを取得します。
Object googlePort = broker.getServicePort(name);

// ここでは、リフレクションを使用して "doSpellingSuggestion" メソッドを取得します。
Method method = googlePort.getClass().getDeclaredMethod
    ("doSpellingSuggestion", new Class[]{String.class, String.class} );

// Java リフレクションを使用して、引数を提供し、メソッドを呼び出します。
String pyramid = (String)method.invoke
      ( googlePort, new Object[]{"myKey", "piramid"});

制限事項
 

現在のフレームワークで強く型付けされたアプリケーションをコンパイルするには、アプリケーションを一度手動で起動する必要があります。また、強く型付けされたコードを今後コンパイルするために、/ClientClassesまたは /ServerClasses フォルダ内のクラスを jar コマンドを使用してまとめる必要があります。この問題については、今後のリリースで取り組みが行われる予定です。