第17章 JAX-WS エンドポイントの設定
概要
JAX-WS エンドポイントは、3 つの Spring 設定要素のいずれかを使用して設定されます。正しい要素は、設定しているエンドポイントのタイプと使用する機能によって異なります。コンシューマーの場合は、jaxws:client 要素を使用します。サービスプロバイダーの場合は、jaxws:endpoint 要素または jaxws:server 要素のいずれかを使用できます。
エンドポイントの定義に使用される情報は、通常、エンドポイントのコントラクトで定義されます。設定要素を使用して、コントラクトの情報を上書きすることができます。設定要素を使用して、コントラクトで提供されていない情報を提供することもできます。
WS-RM などの高度な機能をアクティブにするには、設定要素を使用する必要があります。これは、エンドポイントの設定要素に子要素を提供することによって行われます。Java ファーストのアプローチを使用して開発されたエンドポイントを処理する場合、エンドポイントのコントラクトとして機能する SEI には、使用するバインディングとトランスポートのタイプに関する情報が不足している可能性があることに注意してください。
17.1. サービスプロバイダーの設定 リンクのコピーリンクがクリップボードにコピーされました!
17.1.1. サービスプロバイダー設定の要素 リンクのコピーリンクがクリップボードにコピーされました!
Apache CXF には、サービスプロバイダーの設定に使用できる 2 つの要素があります。
2 つの要素の違いは、主にランタイムの内部にあります。jaxws:endpoint 要素は、サービスエンドポイントをサポートするために作成された org.apache.cxf.jaxws.EndpointImpl オブジェクトにプロパティーを挿入します。jaxws:server 要素は、エンドポイントをサポートするために作成された org.apache.cxf.jaxws.support.JaxWsServerFactoryBean オブジェクトにプロパティーをインジェクトします。EndpointImpl オブジェクトは、設定データを JaxWsServerFactoryBean オブジェクトに渡します。JaxWsServerFactoryBean オブジェクトは、実際のサービスオブジェクトを作成するために使用されます。どちらの設定要素もサービスエンドポイントを設定するため、好みの構文に基づいて選択できます。
17.1.2. jaxws:endpoint 要素の使用 リンクのコピーリンクがクリップボードにコピーされました!
概要 リンクのコピーリンクがクリップボードにコピーされました!
jaxws:endpoint 要素は、JAX-WS サービスプロバイダーを設定するためのデフォルトの要素です。その属性と子は、サービスプロバイダーをインスタンス化するために必要なすべての情報を指定します。属性の多くは、サービスのコントラクトの情報にマップされます。子は、インターセプターやその他の高度な機能を設定するために使用されます。
設定されているエンドポイントの特定 リンクのコピーリンクがクリップボードにコピーされました!
ランタイムが設定を適切なサービスプロバイダーに適用するには、ランタイムがそれを識別できる必要があります。サービスプロバイダーを識別するための基本的な手段は、エンドポイントを実装するクラスを指定することです。これは、jaxws:endpoint 要素の implementor 属性を使用して行われます。
異なるエンドポイントが共通の実装を共有する場合は、エンドポイントごとに異なる設定を提供することができます。設定で特定のエンドポイントを区別するには、次の 2 つの方法があります。
serviceName属性とendpointName属性との組み合わせserviceName属性は、サービスのエンドポイントを定義するwsdl:service要素を指定します。endpointName属性は、サービスのエンドポイントを定義する特定のwsdl:port要素を指定します。どちらの属性も、ns:nameの形式で QNames として指定されます。ns は要素の namespace で、name は要素のname属性の値です。注記wsdl:service要素にwsdl:port要素が 1 つしかない場合は、endpointName属性を省略できます。name属性name属性は、サービスのエンドポイントを定義する特定のwsdl:port要素の QName を指定します。QName は、{ns}localPartの形式で提供されます。ns はwsdl:port要素の namespace で、localPart はwsdl:port要素のname属性の値です。
属性 リンクのコピーリンクがクリップボードにコピーされました!
jaxws:endpoint 要素の属性は、エンドポイントの基本プロパティーを設定します。これらのプロパティーには、エンドポイントのアドレス、エンドポイントを実装するクラス、およびエンドポイントをホストする bus が含まれます。
表17.1「jaxws:endpoint 要素を使用して JAX-WS サービスプロバイダーを設定するための属性」 は、jaxws:endpoint 要素の属性について説明しています。
| 属性 | 説明 |
|---|---|
| 他の設定要素がエンドポイントを参照するのに使用できる一意の識別子を指定します。 | |
| サービスを実装するクラスを指定します。実装クラスを設定する Spring Bean へのクラス名または ID 参照のいずれかを使用して、実装クラスを指定できます。このクラスはクラスパス上にある必要があります。 | |
|
サービスを実装するクラスを指定します。この属性は、 | |
| HTTP エンドポイントのアドレスを指定します。この値は、サービスコントラクトで指定された値を上書きします。 | |
| エンドポイントの WSDL コントラクトの場所を指定します。WSDL コントラクトの場所は、サービスのデプロイ元のフォルダーを基準にしています。 | |
|
サービスの | |
|
サービスの | |
|
サービスを自動的に公開するかどうかを指定します。これを | |
| サービスエンドポイントの管理に使用されるバスを設定する Spring Bean の ID を指定します。これは、共通の機能セットを使用するように複数のエンドポイントを設定する場合に役立ちます。 | |
| サービスが使用するメッセージバインディングの ID を指定します。有効なバインディング ID のリストは、23章Apache CXF バインディング ID に提供されています。 | |
|
サービスの | |
|
Bean が抽象 Bean であるかどうかを指定します。抽象 Bean は、具体的な Bean 定義の親として機能し、インスタンス化されません。デフォルトは | |
| インスタンス化する前にエンドポイントがインスタンス化に依存する Bean のリストを指定します。 | |
|
ユーザーが、
デフォルトは
これを
| |
|
生成された WSDL の |
表17.1「jaxws:endpoint 要素を使用して JAX-WS サービスプロバイダーを設定するための属性」 に一覧表示される属性の他に、複数の xmlns:shortName 属性を使用して endpointName および serviceName 属性によって使用される namespace を宣言する必要がある場合があります。
例 リンクのコピーリンクがクリップボードにコピーされました!
例17.1「シンプルな JAX-WS エンドポイント設定」 は、エンドポイントが公開されるアドレスを指定する JAX-WS エンドポイントの設定を示しています。この例では、他のすべての値にデフォルトを使用するか、実装で注釈に値が指定されていることを前提としています。
例17.1 シンプルな JAX-WS エンドポイント設定
例17.2「サービス名を使用した JAX-WS エンドポイント設定」 は、コントラクトに 2 つのサービス定義が含まれている JAX-WS エンドポイントの設定を示しています。この場合、serviceName 属性を使用してインスタンス化するサービス定義を指定する必要があります。
例17.2 サービス名を使用した JAX-WS エンドポイント設定
xmlns:samp 属性は、WSDL service 要素が定義される namespace を指定します。
例17.3「HTTP/2 が有効になっている JAX-WS エンドポイント設定」 は、HTTP/2 が有効になっているアドレスを指定する JAX-WS エンドポイントの設定を示しています。
Apache CXF 用の HTTP/2 の設定
Apache Karaf でスタンドアロン Apache CXF Undertow トランスポート (http-undertow ) を使用する場合、HTTP/2 がサポートされます。HTTP/2 プロトコルを有効にするには、jaxws:endpoint 要素の address 属性を絶対 URL として設定し、org.apache.cxf.transports.http_undertow.EnableHttp2 プロパティーを true に設定する必要があります。
この HTTP/2 実装は、プレーン HTTP または HTTPS を使用したサーバー側の HTTP/2 トランスポートのみをサポートします。
例17.3 HTTP/2 が有効になっている JAX-WS エンドポイント設定
パフォーマンスを向上させるために、Red Hat は Apache Karaf でサーブレットトランスポート (pax-web-undertow) を使用することを推奨します。これにより、Web コンテナーの集中設定およびチューニングが可能になりますが、pax-web-undertow は HTTP/2 トランスポートプロトコルをサポートしません。
17.1.3. jaxws:server 要素の使用 リンクのコピーリンクがクリップボードにコピーされました!
概要 リンクのコピーリンクがクリップボードにコピーされました!
jaxws:server 要素は JAX-WS サービスプロバイダーを設定する要素です。org.apache.cxf.jaxws.support.JaxWsServerFactoryBean に設定情報を注入します。これは Apache CXF 固有のオブジェクトです。純粋な Spring アプローチを使用してサービスを構築している場合、サービスと対話するために Apache CXF 固有の API を使用する必要はありません。
jaxws:server 要素の属性および子は、サービスプロバイダーをインスタンス化するために必要なすべての情報を指定します。属性は、エンドポイントをインスタンス化するために必要な情報を指定します。子は、インターセプターやその他の高度な機能を設定するために使用されます。
設定されているエンドポイントの特定 リンクのコピーリンクがクリップボードにコピーされました!
ランタイムが設定を適切なサービスプロバイダーに適用するには、ランタイムがそれを識別できる必要があります。サービスプロバイダーを識別するための基本的な手段は、エンドポイントを実装するクラスを指定することです。これは、jaxws:server 要素の serviceBean 属性を使用して行います。
異なるエンドポイントが共通の実装を共有する場合は、エンドポイントごとに異なる設定を提供することができます。設定で特定のエンドポイントを区別するには、次の 2 つの方法があります。
serviceName属性とendpointName属性との組み合わせserviceName属性は、サービスのエンドポイントを定義するwsdl:service要素を指定します。endpointName属性は、サービスのエンドポイントを定義する特定のwsdl:port要素を指定します。どちらの属性も、ns:nameの形式で QNames として指定されます。ns は要素の namespace で、name は要素のname属性の値です。注記wsdl:service要素にwsdl:port要素が 1 つしかない場合は、endpointName属性を省略できます。name属性name属性は、サービスのエンドポイントを定義する特定のwsdl:port要素の QName を指定します。QName は、{ns}localPartの形式で提供されます。ns はwsdl:port要素の namespace で、localPart はwsdl:port要素のname属性の値です。
属性 リンクのコピーリンクがクリップボードにコピーされました!
jaxws:server 要素の属性は、エンドポイントの基本プロパティーを設定します。これらのプロパティーには、エンドポイントのアドレス、エンドポイントを実装するクラス、およびエンドポイントをホストする bus が含まれます。
表17.2「jaxws:server 要素を使用して JAX-WS サービスプロバイダーを設定するための属性」 は、jaxws:server 要素の属性を説明します。
| 属性 | 説明 |
|---|---|
| 他の設定要素がエンドポイントを参照するのに使用できる一意の識別子を指定します。 | |
| サービスを実装するクラスを指定します。実装クラスを設定する Spring Bean へのクラス名または ID 参照のいずれかを使用して、実装クラスを指定できます。このクラスはクラスパス上にある必要があります。 | |
|
サービスを実装するクラスを指定します。この属性は、 | |
| HTTP エンドポイントのアドレスを指定します。この値は、サービスコントラクトで指定された値を上書きします。 | |
| エンドポイントの WSDL コントラクトの場所を指定します。WSDL コントラクトの場所は、サービスのデプロイ元のフォルダーを基準にしています。 | |
|
サービスの | |
|
サービスの | |
|
サービスを自動的に公開するかどうかを指定します。これを | |
| サービスエンドポイントの管理に使用されるバスを設定する Spring Bean の ID を指定します。これは、共通の機能セットを使用するように複数のエンドポイントを設定する場合に役立ちます。 | |
| サービスが使用するメッセージバインディングの ID を指定します。有効なバインディング ID のリストは、23章Apache CXF バインディング ID に提供されています。 | |
|
サービスの | |
|
Bean が抽象 Bean であるかどうかを指定します。抽象 Bean は、具体的な Bean 定義の親として機能し、インスタンス化されません。デフォルトは | |
| エンドポイントをインスタンス化する前に、エンドポイントがインスタンス化に依存する Bean のリストを指定します。 | |
|
ユーザーが、
デフォルトは
これを
|
表17.2「jaxws:server 要素を使用して JAX-WS サービスプロバイダーを設定するための属性」 に一覧表示される属性の他に、複数の xmlns:shortName 属性を使用して endpointName および serviceName 属性によって使用される namespace を宣言する必要がある場合があります。
例 リンクのコピーリンクがクリップボードにコピーされました!
例17.4「シンプルな JAX-WS サーバー設定」 は、エンドポイントが公開されるアドレスを指定する JAX-WS エンドポイントの設定を示しています。
例17.4 シンプルな JAX-WS サーバー設定
17.1.4. サービスプロバイダーへの機能の追加 リンクのコピーリンクがクリップボードにコピーされました!
概要 リンクのコピーリンクがクリップボードにコピーされました!
jaxws:endpoint および jaxws:server 要素は、サービスプロバイダーをインスタンス化するために必要な基本的な設定情報を提供します。サービスプロバイダーに機能を追加したり、高度な設定を実行したりするには、設定に子要素を追加する必要があります。
子要素を使用すると、次のことができます。
要素 リンクのコピーリンクがクリップボードにコピーされました!
表17.3「JAX-WS サービスプロバイダーの設定に使用される要素」 では、jaxws:endpoint がサポートする子要素が説明されています。
| 要素 | 説明 |
|---|---|
| メッセージを処理するための JAX-WS ハンドラー実装のリストを指定します。JAX-WS ハンドラーの実装の詳細は、43章ハンドラーの作成 を参照してください。 | |
| インバウンド要求を処理するインターセプターのリストを指定します。詳細は、パートVII「Apache CXF インターセプターの開発」 を参照してください。 | |
| インバウンド障害メッセージを処理するインターセプターのリストを指定します。詳細は、パートVII「Apache CXF インターセプターの開発」 を参照してください。 | |
| アウトバウンド応答を処理するインターセプターのリストを指定します。詳細は、パートVII「Apache CXF インターセプターの開発」 を参照してください。 | |
| アウトバウンド障害メッセージを処理するインターセプターのリストを指定します。詳細は、パートVII「Apache CXF インターセプターの開発」 を参照してください。 | |
|
エンドポイントが使用するメッセージバインディングを設定する Bean を指定します。メッセージバインディングは、 | |
|
| エンドポイントで使用されるデータバインディングを実装するクラスを指定します。これは、埋め込み Bean 定義を使用して指定されます。 |
| サービスに使用される Java エグゼキュータを指定します。これは、埋め込み Bean 定義を使用して指定されます。 | |
| Apache CXF の高度な機能を設定する Bean のリストを指定します。Bean 参照のリストまたは埋め込み Bean のリストのいずれかを提供できます。 | |
| サービスが使用する org.apache.cxf.service.Invoker インターフェイスの実装を指定します。 [c] | |
| エンドポイントに渡されるプロパティーの Spring マップを指定します。これらのプロパティーを使用して、MTOM サポートの有効化などの機能を制御できます。 | |
|
サービスのインスタンス化に使用される | |
[a]
SOAP バインディングは soap:soapBinding Bean を使用して設定されます。
[c]
Invoker 実装は、サービスの呼び出し方法を制御します。たとえば、各リクエストをサービス実装の新しいインスタンスで処理するかどうか、または呼び出し間で状態を保持するかどうかを制御します。
| |
17.1.5. JAX-WS エンドポイントでスキーマ検証を有効にする リンクのコピーリンクがクリップボードにコピーされました!
概要 リンクのコピーリンクがクリップボードにコピーされました!
schema-validation-enabled プロパティーを設定して、jaxws:endpoint 要素または jaxws: server 要素でスキーマ検証を有効にできます。スキーマ検証が有効になっている場合、クライアントとサーバー間で送信されるメッセージは、スキーマに準拠しているかどうかがチェックされます。スキーマ検証はパフォーマンスに大きな影響を与えるため、デフォルトではオフになっています。
例 リンクのコピーリンクがクリップボードにコピーされました!
JAX-WS エンドポイントでスキーマ検証を有効にするには、jaxws:endpoint 要素または jaxws:server 要素の jaxws:properties 子要素の schema-validation-enabled プロパティーを設定します。たとえば、jaxws:endpoint 要素でスキーマ検証を有効にするには、以下を実行します。
schema-validation-enabled プロパティーの許可される値の一覧は、「スキーマ検証タイプの値」 を参照してください。