第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]
Copy to Clipboard Toggle word wrap
Web サービスを公開するには、mapping-type を次のいずれかの値に設定する必要があります。
Expand
マッピングタイプ 説明
rootqname メッセージに含まれるルート要素の修飾名に基づいて Web サービスリクエストをマップするオプションを提供します。
soapaction メッセージのヘッダーに指定された SOAP アクションに基づいて Web サービスリクエストをマップするために使用されます。
uri 特定の URI をターゲットとする Web サービスリクエストをマップします。
xpathresult XPath の評価に基づいて Web サービスリクエストを受信メッセージに対してマッピングするために使用されます。評価の結果は、エンドポイント URI に指定された XPath 結果と一致する必要があります。
beanname PayloadRootQNameEndpointMappingSonapActionEndpointMapping などの既存の(レガシー) エンドポイントマッピング と統合するために、org.apache.camel.component.spring.ws.bean.CamelEndpoint Dispatcher を参照できます。
コンシューマーの場合、address には、指定された mapping-type (SOAP アクション、XPath 式など)に関連する値が含まれている必要があります。プロデューサーとして、アドレスを呼び出している Web サービスの URI に設定する必要があります。
URI にクエリーオプションを追加するには、?option=value&option=value&.. の形式を使用します。

オプション

Expand
名前 必須 ? 説明
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-typexpathresultの場合のみ 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-typerootqnamesoapactionuri、または 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 エンドポイントにディスパッチし、PayloadRootQNameEndpointMappingSoapActionEndpointMapping などの既存の(レガシー)エンドポイントマッピングと統合します。
messageFilter いいえ 2.10.3 以降カスタム MessageFilter を提供するオプション。たとえば、ヘッダーまたは添付ファイルを独自に処理する場合などです。
messageIdStrategy いいえ 一意のメッセージ ID の生成を制御するカスタム MessageIdStrategy
webServiceEndpointUri いいえ プロデューサーに使用するデフォルトの Web サービスエンドポイント URI。

メッセージヘッダー

Expand
名前 タイプ 説明
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")
Copy to Clipboard Toggle word wrap
メッセージを送信し、以下を実行します。
template.requestBody("direct:example", "<foobar xmlns=\"http://foo.com\"><msg>test message</msg></foobar>");
Copy to Clipboard Toggle word wrap
呼び出す 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")
Copy to Clipboard Toggle word wrap
オプションで、エンドポイントオプションをヘッダー値で上書きできます。
template.requestBodyAndHeader("direct:example", 
"<foobar xmlns=\"http://foo.com\"><msg>test message</msg></foobar>", 
SpringWebserviceConstants.SPRING_WS_SOAP_ACTION, "http://baz.com");
Copy to Clipboard Toggle word wrap

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>";
Copy to Clipboard Toggle word wrap
以下のように、Camel Message にボディーとヘッダーを設定できます。
exchange.getIn().setBody(body);
exchange.getIn().setHeader(SpringWebserviceConstants.SPRING_WS_SOAP_HEADER, soapHeader);
Copy to Clipboard Toggle word wrap
その後、エクスチェンジを 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(...))
Copy to Clipboard Toggle word wrap
注記:パイプラインのエクスチェンジヘッダーにテキストが含まれる場合、soap ヘッダーに Qname (key)=value 属性が生成されます。QName クラスを直接作成し、任意のキーをヘッダーに配置することが推奨されます。

MTOM 添付ファイルの使用方法

BasicMessageFilter は、MTOM メッセージを生成するために Apache Axiom に必要なすべての情報を提供します。Apache Axiom 内で Apache Camel Spring WS を使用する場合は、1 の例を示します。messageFactory を bellow として定義し、Spring-WS は MTOM ストラテジーを使用して、最適化された添付ファイルで SOAP メッセージを設定します。
<bean id="axiomMessageFactory"
class="org.springframework.ws.soap.axiom.AxiomSoapMessageFactory">
<property name="payloadCaching" value="false" />
<property name="attachmentCaching" value="true" />
<property name="attachmentCacheThreshold" value="1024" />
</bean>
Copy to Clipboard Toggle word wrap
2.以下の依存関係を pom.xml に追加します。
<dependency>
<groupId>org.apache.ws.commons.axiom</groupId>
<artifactId>axiom-api</artifactId>
<version>1.2.13</version>
</dependency>
<dependency>
<groupId>org.apache.ws.commons.axiom</groupId>
<artifactId>axiom-impl</artifactId>
<version>1.2.13</version>
<scope>runtime</scope>
</dependency>
Copy to Clipboard Toggle word wrap
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)));	 }
}
Copy to Clipboard Toggle word wrap
4.以下のように、エンドポイント(producer)を ussual として定義します。
from("direct:send")
.process(new Attachement())
.to("spring-ws:http://localhost:8089/mySoapService?soapAction=mySoap&messageFactory=axiomMessageFactory");
Copy to Clipboard Toggle word wrap
5.これで、プロデューサーは otpmized attachments で MTOM メッセージを生成します。

カスタムヘッダーおよび添付フィルター

ヘッダーまたは添付のカスタム処理を提供する必要がある場合は、既存の BasicMessageFilter を拡張し、適切なメソッドを上書きするか、MessageFilter インターフェイスの完全に新しい実装を作成します。カスタムフィルターを使用するには、これを Spring コンテキストに追加します。以下のようにグローバル a またはローカルメッセージフィルターのいずれかを指定できます。a)すべての Spring-WS エンドポイントのグローバル設定を提供するグローバルカスタムフィルターを指定します。
 
<bean id="messageFilter" class="your.domain.myMessageFiler" scope="singleton" />
Copy to Clipboard Toggle word wrap
または b)ローカルの messageFilter をエンドポイント上で以下のように直接実行します。
to("spring-ws:http://yourdomain.com?messageFilter=#myEndpointSpecificMessageFilter");
Copy to Clipboard Toggle word wrap
詳細は 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*/ }
Copy to Clipboard Toggle word wrap

カスタム MessageSender および MessageFactory の使用

レジストリー内のカスタムメッセージの送信者またはファクトリーは、以下のように参照できます。
from("direct:example")
.to("spring-ws:http://foo.com/bar?messageFactory=#messageFactory&messageSender=#messageSender")
Copy to Clipboard Toggle word wrap
Spring の設定:
<!-- authenticate using HTTP Basic Authentication -->
<bean id="messageSender" class="org.springframework.ws.transport.http.HttpComponentsMessageSender">
	<property name="credentials">
		<bean class="org.apache.commons.httpclient.UsernamePasswordCredentials">
			<constructor-arg index="0" value="admin"/>
			<constructor-arg index="1" value="secret"/>
		</bean>
	</property>
</bean>

<!-- force use of Sun SAAJ implementation, http://static.springsource.org/spring-ws/sites/1.5/faq.html#saaj-jboss -->
<bean id="messageFactory" class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory">
	<property name="messageFactory">
		<bean class="com.sun.xml.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl"></bean>
	</property>
</bean>
Copy to Clipboard Toggle word wrap

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
<web-app>
    <servlet>
        <servlet-name>spring-ws</servlet-name>
        <servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>spring-ws</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>
Copy to Clipboard Toggle word wrap
spring-ws-servlet.xml
<bean id="endpointMapping" class="org.apache.camel.component.spring.ws.bean.CamelEndpointMapping" />

<bean id="wsdl" class="org.springframework.ws.wsdl.wsdl11.DefaultWsdl11Definition">
	  <property name="schema"> 
    		<bean class="org.springframework.xml.xsd.SimpleXsdSchema">                   
      			<property name="xsd" value="/WEB-INF/foobar.xsd"/>
    		</bean>    
  	</property>                                        
	  <property name="portTypeName" value="FooBar"/>                                
	  <property name="locationUri" value="/"/>                              
	  <property name="targetNamespace" value="http://example.com/"/>       
</bean>
Copy to Clipboard Toggle word wrap
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)
Copy to Clipboard Toggle word wrap
以下のルートは、http://example.com/GetFoo SOAP アクションを含む Web サービスリクエストを受信します。
from("spring-ws:soapaction:http://example.com/GetFoo?endpointMapping=#endpointMapping")
.convertBodyTo(String.class).to(mock:example)
Copy to Clipboard Toggle word wrap
以下のルートは、http://example.com/foobar に送信されたすべての要求を受信します。
from("spring-ws:uri:http://example.com/foobar?endpointMapping=#endpointMapping")
.convertBodyTo(String.class).to(mock:example)
Copy to Clipboard Toggle word wrap
以下のルートは、メッセージ内の任意の場所(およびデフォルトの namespace)の < foobar>abc </foobar> 要素が含まれる要求を受信します。
from("spring-ws:xpathresult:abc?expression=//foobar&endpointMapping=#endpointMapping")
.convertBodyTo(String.class).to(mock:example)
Copy to Clipboard Toggle word wrap

既存のエンドポイントマッピングを使用した代替設定

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 を使用したルートの例:
<camelContext xmlns="http://camel.apache.org/schema/spring">
	<route>
		<from uri="spring-ws:beanname:QuoteEndpointDispatcher" />
		<to uri="mock:example" />
	</route>
</camelContext>

<bean id="legacyEndpointMapping" class="org.springframework.ws.server.endpoint.mapping.PayloadRootQNameEndpointMapping">
    <property name="mappings">
        <props>
            <prop key="{http://example.com/}GetFuture">FutureEndpointDispatcher</prop>
            <prop key="{http://example.com/}GetQuote">QuoteEndpointDispatcher</prop>
        </props>
    </property>
</bean>

<bean id="QuoteEndpointDispatcher" class="org.apache.camel.component.spring.ws.bean.CamelEndpointDispatcher" />
<bean id="FutureEndpointDispatcher" class="org.apache.camel.component.spring.ws.bean.CamelEndpointDispatcher" />
Copy to Clipboard Toggle word wrap

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);
Copy to Clipboard Toggle word wrap
同様に、Web サービスを 提供 する場合と同様に、POJO への XML リクエストをアンマーシャリングし、応答メッセージを XML にマーシャリングすることができます。
from("spring-ws:rootqname:{http://example.com/}GetFoo?endpointMapping=#endpointMapping").unmarshal(jaxb)
.to("mock:example").marshal(jaxb);
Copy to Clipboard Toggle word wrap
トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat