Menu Close

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 オブジェクトに注入されます。このオブジェクトを使用して、プロキシーの外部サービスに対して呼び出しを実行できます。