Fuse 6 is no longer supported
As of February 2025, Red Hat Fuse 6 is no longer supported. If you are using Fuse 6, please upgrade to Red Hat build of Apache Camel.第164章 Spring Web Services
Spring Web Services コンポーネント リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
spring-ws: コンポーネントを使用すると、Spring Web Services と統合できます。Web サービスへ のアクセス、および独自のコントラクトファースト Web サービスを作成するための サーバー側のサポートの両方を提供します。
Dependencies
Camel 2.8 以降、このコンポーネントは Spring-WS 2.0.x に同梱されており(残りの Camel のように)、Spring 3.0.x が必要です。
以前のバージョンの Camel には Spring 2.5.x および 3.0.x との互換性がある Spring-WS 1.5.9 が同梱されていました。Spring 2.5.x で以前のバージョンの
camel-spring-ws
を実行するには、Spring 2.5.x から spring-webmvc
モジュールを追加する必要があります。Spring 3.0.x で Spring-WS 1.5.9 を実行するには、このモジュールが Spring-WS 1.5.9 にも含まれているため、OXM モジュールを Spring 3.0.x から除外する必要があります(を参照)。http://stackoverflow.com/questions/3313314/can-spring-ws-1-5-be-used-with-spring-3
URI 形式 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
このコンポーネントの URI スキームは以下のとおりです。
spring-ws:[mapping-type:]address[?options]
spring-ws:[mapping-type:]address[?options]
Web サービスを公開するには、
mapping-type
を次のいずれかの値に設定する必要があります。
マッピングタイプ | 説明 |
---|---|
rootqname
|
メッセージに含まれるルート要素の修飾名に基づいて Web サービスリクエストをマップするオプションを提供します。 |
soapaction
|
メッセージのヘッダーに指定された SOAP アクションに基づいて Web サービスリクエストをマップするために使用されます。 |
uri
|
特定の URI をターゲットとする Web サービスリクエストをマップします。 |
xpathresult
|
XPath 式 の評価に基づいて Web サービスリクエストを受信メッセージに対してマッピングするために使用されます。評価の結果は、エンドポイント URI に指定された XPath 結果と一致する必要があります。
|
beanname
|
PayloadRootQNameEndpointMapping 、SonapActionEndpointMapping などの既存の(レガシー) エンドポイントマッピング と統合するために、 を参照できます。
|
コンシューマーの場合、
address
には、指定された mapping-type (SOAP アクション、XPath 式など)に関連する値が含まれている必要があります。プロデューサーとして、アドレスを呼び出している Web サービスの URI に設定する必要があります。
URI にクエリーオプションを追加するには、
?option=value&option=value&.. の形式を使用します。
オプション リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
名前 | 必須 ? | 説明 |
---|---|---|
soapAction
|
いいえ | リモート Web サービスにアクセスするときに SOAP リクエスト内に含める SOAP アクション |
wsAddressingAction
|
いいえ |
Web サービスへのアクセス時に含む WS-Addressing 1.0 アクションヘッダー。To ヘッダーは、エンドポイント URI で指定される Web サービスの アドレス に設定されます(デフォルトでは Spring-WS の動作)。
|
outputAction
|
いいえ | メソッドによって提供される応答 WS-Addressing Action ヘッダーの値を示します。 |
faultAction
|
いいえ |
メソッドによって提供される faultAction 応答 WS-Addressing Fault Action ヘッダーの値を示します。
|
faultTo
|
いいえ |
メソッドによって提供される faultAction 応答 WS-Addressing FaultTo ヘッダーの値を示します。
|
replyTo
|
いいえ |
メソッドによって提供される replyTo 応答 WS-Addressing ReplyTo ヘッダーの値を示します。
|
expression
|
mapping-type が xpathresult の場合のみ
|
Web サービス要求のマッピングプロセスで使用する XPath 式。xpathresult で指定された結果と一致する必要があります。
|
timeout
|
いいえ |
Camel 2.10: プロデューサーを使用して Web サービスを呼び出す際にソケットの読み取りタイムアウト(ミリ秒単位)を設定します 。URLConnection.setReadTimeout ()および CommonsHttpMessageSender.setReadTimeout ()を参照してください。組み込みメッセージの送信者実装を使用する場合は、オプションが機能する: CommonsHttpMessageSender nd HttpUrlConnectionMessageSender。コンポーネントに指定された Spring WS 設定オプションをカスタマイズしない限り、これらの実装はデフォルトで HTTP ベースのサービスに使用されます。標準以外の送信者を使用していること。 独自のタイムアウト設定を処理することを前提とします。Camel 2.12: We built-in message sender HttpComponentsMessageSender s considered instead of CommonsHttpMessageSender hich has been deprecated, see HttpComponentsMessageSender.setReadTimeout ()を参照してください。
|
sslContextParameters
|
いいえ |
Camel 2.10: Registry の
org.apache.camel.util.jsse.SSLContextParameters オブジェクトへの参照。 Using the JSSE Configuration Utility を参照してください。 このオプションは、組み込みメッセージ送信者の実装( CommonsHttpMessageSender および HttpUrlConnectionMessageSender )を使用する場合に機能します。 これらの実装の 1 つは、コンポーネントに指定された Spring WS 設定オプションをカスタマイズしない限り、デフォルトで HTTP ベースのサービスに使用されます。 標準以外の送信者を使用している場合は、独自の TLS 設定を処理することを前提とします。Security Guide の Configuring Transport Security for Camel Components の章を参照してください。
Camel 2.12: 組み込みメッセージの送信者 HttpComponentsMessageSender は、非推奨となったCommonsHttpMessageSender の代わり に考慮されます。
|
webServiceTemplate
|
いいえ | カスタム WebServiceTemplate を提供するオプション。これにより、カスタムインターセプターの追加やフォールトリゾルバー、メッセージ送信者、メッセージファクトリーの指定など、クライアント側の Web サービス処理を完全に制御できます。 |
messageSender
|
いいえ | カスタム WebServiceMessageSender を提供するオプション。たとえば、認証を実行したり、代替トランスポートを使用したりするには、以下を実行します。 |
messageFactory
|
いいえ | カスタム WebServiceMessageFactory を提供するオプション。たとえば、Apache Axiom が SAAJ ではなく Web サービスメッセージを処理する場合などです。 |
endpointMappingKey
|
いいえ |
org.apache.camel.component.spring.ws.type.EndpointMappingKey のインスタンスへの参照。
|
endpointMapping
|
mapping-type が rootqname 、soapaction 、uri 、または xpathresult の場合のみ
|
Registry/ApplicationContext の org.apache.camel.component.spring.ws.bean.CamelEndpointMapping への参照。すべての Camel/Spring-WS エンドポイントを提供するには、レジストリーに 1 つの Bean のみが必要です。この Bean は MessageDispatcher によって自動検出され、エンドポイントに指定された特性(ルート QName、SOAP アクションなど)に基づいてリクエストを Camel エンドポイントにマッピングするために使用されます。
|
endpointDispatcher
|
いいえ |
Spring org.springframework.ws.server.endpoint.MessageEndpoint : Spring-WS によって受信されたメッセージを Camel エンドポイントにディスパッチし、PayloadRootQNameEndpointMapping 、SoapActionEndpointMapping などの既存の(レガシー)エンドポイントマッピングと統合します。
|
messageFilter
|
いいえ | 2.10.3 以降カスタム MessageFilter を提供するオプション。たとえば、ヘッダーまたは添付ファイルを独自に処理する場合などです。 |
messageIdStrategy
|
いいえ |
一意のメッセージ ID の生成を制御するカスタム MessageIdStrategy 。
|
webServiceEndpointUri
|
いいえ | プロデューサーに使用するデフォルトの Web サービスエンドポイント URI。 |
メッセージヘッダー リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
名前 | タイプ | 説明 |
---|---|---|
CamelSpringWebserviceEndpointUri
|
String
|
クライアントとしてアクセスする Web サービスの URI。エンドポイント URI の アドレス 部分を上書きします。 |
CamelSpringWebserviceSoapAction
|
String
|
メッセージの SOAP アクションを指定するヘッダー。soapAction オプションが存在する場合はそれを上書きします。
|
CamelSpringWebserviceSoapHeader
|
Source | Camel 2.11.1: このヘッダーを使用してメッセージの SOAP ヘッダーを指定/アクセスします。 |
CamelSpringWebserviceAddressingAction
|
URI
|
このヘッダーを使用してメッセージの WS-Addressing アクションを指定します。wsAddressingAction オプションが存在する場合はオーバーライドします。
|
CamelSpringWebserviceAddressingFaultTo
|
URI
|
このヘッダーを使用して WS-Addressing FaultTo を指定します。存在する場合、faultTo オプションを上書きします。
|
CamelSpringWebserviceAddressingReplyTo
|
URI
|
このヘッダーを使用して WS-Addressing ReplyTo を指定します。存在する場合、replyTo オプションを上書きします。
|
CamelSpringWebserviceAddressingOutputAction
|
URI
|
このヘッダーを使用して WS-Addressing Action を指定し、outputAction オプションを上書きします(存在する場合)。
|
CamelSpringWebserviceAddressingFaultAction
|
URI
|
このヘッダーを使用して WS-Addressing Fault Action を指定します。存在する場合、faultAction オプションを上書きします。
|
Web サービスへのアクセス リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Web サービス
を呼び出すには、単にルートを定義します。
from("direct:example").to("spring-ws:http://foo.com/bar")
from("direct:example").to("spring-ws:http://foo.com/bar")
メッセージを送信し、以下を実行します。
template.requestBody("direct:example", "<foobar xmlns=\"http://foo.com\"><msg>test message</msg></foobar>");
template.requestBody("direct:example", "<foobar xmlns=\"http://foo.com\"><msg>test message</msg></foobar>");
呼び出す SOAP サービスの場合は、SOAP タグを含める必要はありません。Spring-WS は XML から SOAP マーシャリングを実行します。
SOAP および WS-Addressing アクションヘッダーの送信 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
リモート Web サービスで SOAP アクションが必要な場合、または WS-Addressing 標準を使用する場合は、以下のようにルートを定義します。
from("direct:example") .to("spring-ws:http://foo.com/bar?soapAction=http://foo.com&wsAddressingAction=http://bar.com")
from("direct:example")
.to("spring-ws:http://foo.com/bar?soapAction=http://foo.com&wsAddressingAction=http://bar.com")
オプションで、エンドポイントオプションをヘッダー値で上書きできます。
template.requestBodyAndHeader("direct:example", "<foobar xmlns=\"http://foo.com\"><msg>test message</msg></foobar>", SpringWebserviceConstants.SPRING_WS_SOAP_ACTION, "http://baz.com");
template.requestBodyAndHeader("direct:example",
"<foobar xmlns=\"http://foo.com\"><msg>test message</msg></foobar>",
SpringWebserviceConstants.SPRING_WS_SOAP_ACTION, "http://baz.com");
SOAP ヘッダーの使用 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Camel 2.11.1 以降で利用可能
String の以下の SOAP ヘッダーにメッセージを送信するときに、SOAP ヘッダーを Camel Message ヘッダーとして提供できます。
String body = ... String soapHeader = "<h:Header xmlns:h=\"http://www.webserviceX.NET/\"><h:MessageID>1234567890</h:MessageID><h:Nested><h:NestedID>1111</h:NestedID></h:Nested></h:Header>";
String body = ...
String soapHeader = "<h:Header xmlns:h=\"http://www.webserviceX.NET/\"><h:MessageID>1234567890</h:MessageID><h:Nested><h:NestedID>1111</h:NestedID></h:Nested></h:Header>";
以下のように、Camel Message にボディーとヘッダーを設定できます。
exchange.getIn().setBody(body); exchange.getIn().setHeader(SpringWebserviceConstants.SPRING_WS_SOAP_HEADER, soapHeader);
exchange.getIn().setBody(body);
exchange.getIn().setHeader(SpringWebserviceConstants.SPRING_WS_SOAP_HEADER, soapHeader);
その後、エクスチェンジを
spring-ws
エンドポイントに送信し、Web サービスを呼び出します。
同様に、spring-ws コンシューマーは SOAP ヘッダーで Camel Message も補完します。
この ユニットテスト の例は、を参照してください。
ヘッダーおよび添付の伝播 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Spring WS Camel は、バージョン 2.10.3 以降の Spring-WS WebServiceMessage 応答へのヘッダーおよび添付の伝搬をサポートします。エンドポイントは、"hook" と呼ばれるものを使用します。MessageFilter (デフォルトは
BasicMessageFilter
)を使用して、交換ヘッダーと添付ファイルを WebServiceMessage
応答に伝播します。これで
exchange.getOut().getHeaders().put("myCustom","myHeaderValue") exchange.getIn().addAttachment("myAttachment", new DataHandler(...))
exchange.getOut().getHeaders().put("myCustom","myHeaderValue")
exchange.getIn().addAttachment("myAttachment", new DataHandler(...))
注記:パイプラインのエクスチェンジヘッダーにテキストが含まれる場合、soap ヘッダーに Qname (key)=value 属性が生成されます。QName クラスを直接作成し、任意のキーをヘッダーに配置することが推奨されます。
MTOM 添付ファイルの使用方法 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
BasicMessageFilter は、MTOM メッセージを生成するために Apache Axiom に必要なすべての情報を提供します。Apache Axiom 内で Apache Camel Spring WS を使用する場合は、1 の例を示します。messageFactory を bellow として定義し、Spring-WS は MTOM ストラテジーを使用して、最適化された添付ファイルで SOAP メッセージを設定します。
2.以下の依存関係を pom.xml に追加します。
3.Processor 実装などを使用して、添付をパイプラインに追加します。
private class Attachement implements Processor { public void process(Exchange exchange) throws Exception { exchange.getOut().copyFrom(exchange.getIn()); File file = new File("testAttachment.txt"); exchange.getOut().addAttachment("test", new DataHandler(new FileDataSource(file))); } }
private class Attachement implements Processor {
public void process(Exchange exchange) throws Exception
{ exchange.getOut().copyFrom(exchange.getIn()); File file = new File("testAttachment.txt"); exchange.getOut().addAttachment("test", new DataHandler(new FileDataSource(file))); }
}
4.以下のように、エンドポイント(producer)を ussual として定義します。
from("direct:send") .process(new Attachement()) .to("spring-ws:http://localhost:8089/mySoapService?soapAction=mySoap&messageFactory=axiomMessageFactory");
from("direct:send")
.process(new Attachement())
.to("spring-ws:http://localhost:8089/mySoapService?soapAction=mySoap&messageFactory=axiomMessageFactory");
5.これで、プロデューサーは otpmized attachments で MTOM メッセージを生成します。
カスタムヘッダーおよび添付フィルター リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
ヘッダーまたは添付のカスタム処理を提供する必要がある場合は、既存の BasicMessageFilter を拡張し、適切なメソッドを上書きするか、MessageFilter インターフェイスの完全に新しい実装を作成します。カスタムフィルターを使用するには、これを Spring コンテキストに追加します。以下のようにグローバル a またはローカルメッセージフィルターのいずれかを指定できます。a)すべての Spring-WS エンドポイントのグローバル設定を提供するグローバルカスタムフィルターを指定します。
<bean id="messageFilter" class="your.domain.myMessageFiler" scope="singleton" />
<bean id="messageFilter" class="your.domain.myMessageFiler" scope="singleton" />
または b)ローカルの messageFilter をエンドポイント上で以下のように直接実行します。
to("spring-ws:http://yourdomain.com?messageFilter=#myEndpointSpecificMessageFilter");
to("spring-ws:http://yourdomain.com?messageFilter=#myEndpointSpecificMessageFilter");
詳細は CAMEL-5724を参照してください。
独自の MessageFilter を作成する場合は、BasicMessageFilter クラスの MessageFilter のデフォルト実装で以下のメソッドを上書きすることを検討してください。
protected void doProcessSoapHeader(Message inOrOut, SoapMessage soapMessage) {your code /*no need to call super*/ } protected void doProcessSoapAttachements(Message inOrOut, SoapMessage response) { your code /*no need to call super*/ }
protected void doProcessSoapHeader(Message inOrOut, SoapMessage soapMessage)
{your code /*no need to call super*/ }
protected void doProcessSoapAttachements(Message inOrOut, SoapMessage response)
{ your code /*no need to call super*/ }
カスタム MessageSender および MessageFactory の使用 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
レジストリー内のカスタムメッセージの送信者またはファクトリーは、以下のように参照できます。
from("direct:example") .to("spring-ws:http://foo.com/bar?messageFactory=#messageFactory&messageSender=#messageSender")
from("direct:example")
.to("spring-ws:http://foo.com/bar?messageFactory=#messageFactory&messageSender=#messageSender")
Spring の設定:
Web サービスの公開 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
このコンポーネントを使用して Web サービスを公開するには、最初に MessageDispatcher を設定して Spring XML ファイルでエンドポイントマッピングを検索する必要があります。サーブレットコンテナー内で実行を計画する場合は、
web.xml
で設定した MessageDispatcherServlet
を使用する必要があります。
デフォルトでは、
MessageDispatcherServlet
は /WEB-INF/spring-ws-servlet.xml
という名前の Spring XML を検索します。Spring-WS で Camel を使用するには、その XML ファイルの唯一の必須 Bean は CamelEndpointMapping
です。この Bean により、MessageDispatcher
は Web サービスリクエストをルートにディスパッチできます。
web.xml
spring-ws-servlet.xml
Spring-WS の設定に関する詳細は Writing Contract-First Web Services を参照してください。
ルートでのエンドポイントマッピング リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
XML 設定のインプレースでは、Camel の DSL を使用して、エンドポイントによって処理される Web サービスリクエストを定義できるようになりました。以下のルートは、
http://example.com/
namespace 内に GetFoo
という名前のルート要素を持つすべての Web サービス要求を受信します。
from("spring-ws:rootqname:{http://example.com/}GetFoo?endpointMapping=#endpointMapping") .convertBodyTo(String.class).to(mock:example)
from("spring-ws:rootqname:{http://example.com/}GetFoo?endpointMapping=#endpointMapping")
.convertBodyTo(String.class).to(mock:example)
以下のルートは、
http://example.com/GetFoo
SOAP アクションを含む Web サービスリクエストを受信します。
from("spring-ws:soapaction:http://example.com/GetFoo?endpointMapping=#endpointMapping") .convertBodyTo(String.class).to(mock:example)
from("spring-ws:soapaction:http://example.com/GetFoo?endpointMapping=#endpointMapping")
.convertBodyTo(String.class).to(mock:example)
以下のルートは、
http://example.com/foobar
に送信されたすべての要求を受信します。
from("spring-ws:uri:http://example.com/foobar?endpointMapping=#endpointMapping") .convertBodyTo(String.class).to(mock:example)
from("spring-ws:uri:http://example.com/foobar?endpointMapping=#endpointMapping")
.convertBodyTo(String.class).to(mock:example)
以下のルートは、メッセージ内の任意の場所(およびデフォルトの namespace)の <
foobar>abc
</foobar> 要素が含まれる要求を受信します。
from("spring-ws:xpathresult:abc?expression=//foobar&endpointMapping=#endpointMapping") .convertBodyTo(String.class).to(mock:example)
from("spring-ws:xpathresult:abc?expression=//foobar&endpointMapping=#endpointMapping")
.convertBodyTo(String.class).to(mock:example)
既存のエンドポイントマッピングを使用した代替設定 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
mapping-type
beanname
を持つすべてのエンドポイントに対して、対応する名前を持つ CamelEndpointDispatcher
タイプの 1 つの Bean が Registry/ApplicationContext に必要です。この Bean は、Camel エンドポイントと PayloadRootQNameEndpointMapping
などの既存の エンドポイントマッピング との間のブリッジとして機能します。
注記
beanname
マッピングタイプの使用は、主に Spring-WS を使用し、Spring XML ファイルで定義されたエンドポイントマッピングを持つ(レガシー)状況を対象としています。beanname
mapping-type を使用すると、Camel ルートを既存のエンドポイントマッピングに接続できます。ゼロから始めている場合は、エンドポイントマッピングを Camel URI の(上記のように endpointMapping
で説明)として定義することが推奨されます。これは設定が少なく、より表現的です。または、アノテーションを使用して vanilla Spring-WS を使用することもできます。
beanname
を使用したルートの例:
POJO (un) marshalling リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Camel の プラグ可能なデータ形式は、JAXB、XStream、JibX、Castor、XMLBean などのライブラリーを使用した POJO/XML マーシャリングをサポートします。ルートでこれらのデータ形式を使用して、Web サービスとの間で POJO (Plain Old Java Objects)を送受信できます。
Web サービスに アクセス する場合は、リクエストをマーシャリングし、応答メッセージをアンマーシャリングできます。
JaxbDataFormat jaxb = new JaxbDataFormat(false); jaxb.setContextPath("com.example.model"); from("direct:example").marshal(jaxb).to("spring-ws:http://foo.com/bar").unmarshal(jaxb);
JaxbDataFormat jaxb = new JaxbDataFormat(false);
jaxb.setContextPath("com.example.model");
from("direct:example").marshal(jaxb).to("spring-ws:http://foo.com/bar").unmarshal(jaxb);
同様に、Web サービスを 提供 する場合と同様に、POJO への XML リクエストをアンマーシャリングし、応答メッセージを XML にマーシャリングすることができます。
from("spring-ws:rootqname:{http://example.com/}GetFoo?endpointMapping=#endpointMapping").unmarshal(jaxb) .to("mock:example").marshal(jaxb);
from("spring-ws:rootqname:{http://example.com/}GetFoo?endpointMapping=#endpointMapping").unmarshal(jaxb)
.to("mock:example").marshal(jaxb);