29.2. インジェクションによるプロキシーのインスタンス化

概要

Apache CXF で Spring Framework を使用すると、JAX-WS API を使用してサービスプロキシーを作成する手間を省くことができます。これにより、設定ファイルでクライアントエンドポイントを定義してから、実装コードにプロキシーを直接挿入できます。ランタイムが実装オブジェクトをインスタンス化すると、設定に基づいて外部サービスのプロキシーもインスタンス化されます。実装は、インスタンス化されたプロキシーを参照して渡されます。

プロキシーは設定ファイルの情報を使用してインスタンス化されるため、WSDL の場所をハードコーディングする必要はありません。展開時に変更できます。ランタイムがアプリケーションのクラスパスで WSDL を検索するように指定することもできます。

手順

外部サービスのプロキシーをサービスプロバイダーの実装に挿入するには、次の手順を実行します。

  1. 必要な WSDL ドキュメントを、アプリケーションのすべての部分がアクセスできる既知の場所にデプロイします。

    注記

    アプリケーションを WAR ファイルとしてデプロイする場合は、WAR の WEB-INF/wsdl フォルダーに WSDL ドキュメントと XML スキーマドキュメントをすべて配置することを推奨します。

    注記

    アプリケーションを JAR ファイルとしてデプロイする場合は、JAR の META-INF/wsdl フォルダーに WSDL ドキュメントと XML スキーマドキュメントをすべて配置することを推奨します。

  2. 注入されるプロキシーの JAX-WS クライアントエンドポイントを 設定 します。
  3. @Resource アノテーションを使用して、サービスプロバイダーにプロキシーを 注入します

プロキシーの設定

アプリケーションの設定ファイルで jaxws:client 要素を使用して JAX-WS クライアントエンドポイントを設定します。これにより、指定のプロパティーの org.apache.cxf.jaxws.JaxWsClientProxy オブジェクトをインスタンス化するようにランタイムに指示します。このオブジェクトは、サービスプロバイダーに注入されるプロキシーです。

少なくとも、次の属性の値を指定する必要があります。

  • id: 挿入されるクライアントを識別するために使用される ID を特定します。
  • serviceClass: プロキシーがリクエストを行うサービスの SEI を指定します。

例29.1「サービス実装に注入されるプロキシーの設定」 は、JAX-WS クライアントエンドポイントの設定を示しています。

例29.1 サービス実装に注入されるプロキシーの設定

<beans ...
  xmlns:jaxws="http://cxf.apache.org/jaxws"
  ...
  schemaLocation="...
    http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
    ...">
  <jaxws:client id="bookClient"
                serviceClass="org.apache.cxf.demo.BookService"
                wsdlLocation="classpath:books.wsdl"/>
  ...
</beans>
注記

例29.1「サービス実装に注入されるプロキシーの設定」では、wsdlLocation 属性がクラスパスから WSDL を読み込むようにランタイムに指示します。books.wsdl がクラスパスにある場合、ランタイムはそれを見つけることができます。

JAX-WS クライアントの設定の詳細については、「コンシューマーエンドポイントの設定」 を参照してください。

プロバイダー実装のコーディング

例29.2「サービス実装へのプロキシーの注入」 に示すように、@Resource を使用して、設定したプロキシーをリソースとしてサービス実装に注入します。

例29.2 サービス実装へのプロキシーの注入

package demo.hw.server;

import org.apache.hello_world_soap_http.Greeter;

@javax.jws.WebService(portName = "SoapPort", serviceName = "SOAPService",
                      targetNamespace = "http://apache.org/hello_world_soap_http",
                      endpointInterface = "org.apache.hello_world_soap_http.Greeter")
public class StoreImpl implements Store {

@Resource(name="bookClient") private BookService proxy;

}

アノテーションの name プロパティーは JAX-WS クライアントの id 属性の値に対応します。設定されたプロキシーは、アノテーションの直後に宣言された BookService オブジェクトに注入されます。このオブジェクトを使用して、プロキシーの外部サービスを呼び出すことができます。