HTTP 受信コンポーネント

HTTP 経由でメッセージを受信するには、HTTP 受信チャネルアダプターまたは HTTP 受信ゲートウェイを使用する必要があります。HTTP 受信アダプターをサポートするには、Apache Tomcat (英語) Jetty (英語) などのサーブレットコンテナー内にデプロイする必要があります。これを行う最も簡単な方法は、web.xml ファイルで次のサーブレット定義を提供することにより、Spring の HttpRequestHandlerServlet (Javadoc) を使用することです。

<servlet>
    <servlet-name>inboundGateway</servlet-name>
    <servlet-class>o.s.web.context.support.HttpRequestHandlerServlet</servlet-class>
</servlet>

サーブレット名が Bean 名と一致していることに注意してください。詳細については、HttpRequestHandlerServlet Javadoc を参照してください。

Spring MVC アプリケーション内で実行している場合、前述の明示的なサーブレット定義は必要ありません。その場合、Spring MVC コントローラー Bean の場合と同様に、ゲートウェイの Bean 名を URL パスと照合できます。詳細については、Spring Framework リファレンスドキュメントの一部である Web MVC フレームワークを参照してください。

サンプルアプリケーションと対応する構成については、Spring Integration サンプル [GitHub] (英語) リポジトリを参照してください。Spring Integration の HTTP サポートを示す HTTP サンプル [GitHub] (英語) アプリケーションが含まれています。

次の例 Bean は、HTTP 受信エンドポイントを定義します。

<bean id="httpInbound"
  class="org.springframework.integration.http.inbound.HttpRequestHandlingMessagingGateway">
  <property name="requestChannel" ref="httpRequestChannel" />
  <property name="replyChannel" ref="httpReplyChannel" />
</bean>

HttpRequestHandlingMessagingGateway は HttpMessageConverter インスタンスのリストを受け入れるか、デフォルトリストに依存します。コンバーターを使用すると、HttpServletRequest から Message へのマッピングをカスタマイズできます。デフォルトのコンバーターは、コンテンツ型が text で始まる POST リクエストに対して String メッセージを作成する単純な戦略をカプセル化します。詳細については、Javadoc を参照してください。追加のフラグ(mergeWithDefaultConverters)をカスタム HttpMessageConverter のリストとともに設定して、カスタムコンバーターの後にデフォルトコンバーターを追加できます。デフォルトでは、このフラグは false に設定されています。これは、カスタムコンバーターがデフォルトリストを置き換えることを意味します。

メッセージ変換プロセスは、(オプションの) requestPayloadType プロパティと受信 Content-Type ヘッダーを使用します。バージョン 4.3 以降、リクエストにコンテンツ型ヘッダーがない場合、RFC 2616 で推奨されているように、application/octet-stream が想定されます。以前は、このようなメッセージの本文は無視されていました。

Spring Integration 2.0 はマルチパートファイルのサポートを実装しました。リクエストが MultipartHttpServletRequest としてラップされている場合、デフォルトのコンバーターを使用すると、そのリクエストは、個々のパートのコンテンツ型に応じて、バイト配列、文字列、Spring の MultipartFile のインスタンスである値を含む MultiValueMap である Message ペイロードに変換されます。

HTTP 受信エンドポイントは、Bean の名前が multipartResolver (Spring の DispatcherServlet が期待する名前)の場合、コンテキスト内で MultipartResolver を見つけます。その Bean が見つかると、受信リクエストマッパーでマルチパートファイルのサポートが有効になります。そうでない場合、マルチパートファイルリクエストを Spring Integration Message にマップしようとすると失敗します。MultipartResolver に対する Spring のサポートの詳細については、Spring リファレンスマニュアルを参照してください。

multipart/form-data を別のサーバーにプロキシする場合は、それを生の形式のままにしておくことをお勧めします。この状況を処理するには、multipartResolver Bean をコンテキストに追加しないでください。byte[] リクエストを予期するようにエンドポイントを構成し、ByteArrayHttpMessageConverter を含むようにメッセージコンバーターをカスタマイズし、デフォルトのマルチパートコンバーターを無効にします。返信には他のコンバーターが必要になる場合があります。次の例は、このような配置を示しています。

<int-http:inbound-gateway
                  channel="receiveChannel"
                  path="/inboundAdapter.htm"
                  request-payload-type="byte[]"
                  message-converters="converters"
                  merge-with-default-converters="false"
                  supported-methods="POST" />

<util:list id="converters">
    <beans:bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter" />
    <beans:bean class="org.springframework.http.converter.StringHttpMessageConverter" />
    <beans:bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" />
</util:list>

クライアントにレスポンスを送信する場合、ゲートウェイの動作をカスタマイズする方法はいくつかあります。デフォルトでは、ゲートウェイは 200 ステータスコードを返送することにより、リクエストが受信されたことを確認します。Spring MVC ViewResolver によって解決される "viewName" を提供することにより、このレスポンスをカスタマイズすることができます。ゲートウェイが Message へのレスポンスを期待する必要がある場合は、expectReply フラグ (コンストラクター引数) を設定して、HTTP レスポンスを作成する前にゲートウェイが Message のレスポンスを待機するようにすることができます。次の例では、ビュー名を持つ Spring MVC コントローラーとして機能するようにゲートウェイを構成しています。

<bean id="httpInbound"
  class="org.springframework.integration.http.inbound.HttpRequestHandlingController">
  <constructor-arg value="true" /> <!-- indicates that a reply is expected -->
  <property name="requestChannel" ref="httpRequestChannel" />
  <property name="replyChannel" ref="httpReplyChannel" />
  <property name="viewName" value="jsonView" />
  <property name="supportedMethodNames" >
    <list>
      <value>GET</value>
      <value>DELETE</value>
    </list>
  </property>
</bean>

true の constructor-arg 値のため、応答を待機します。上記の例は、ゲートウェイで受け入れられる HTTP メソッド(デフォルトでは POST および GET)をカスタマイズする方法も示しています。

応答メッセージはモデルマップで利用できます。デフォルトでは、そのマップエントリのキーは "reply" ですが、エンドポイントの構成で "replyKey" プロパティを設定することにより、このデフォルトをオーバーライドできます。

ペイロード検証

バージョン 5.2 以降では、チャネルに送信する前にペイロードをチェックするために、HTTP 受信 エンドポイントに Validator を提供できます。このペイロードは、貴重なデータに関する検証範囲を狭めるための payloadExpression 後の変換と抽出の結果としてすでに生成されています。検証失敗の処理は、Spring MVC エラー処理のものと完全に同じです。