送信メッセージの変換

Spring AMQP 1.4 は ContentTypeDelegatingMessageConverter を導入しましたが、実際のコンバーターは受信コンテンツ型メッセージプロパティに基づいて選択されます。これは、受信エンドポイントで使用できます。

Spring Integration バージョン 4.3 では、使用するコンバーターを指定する contentType ヘッダーを使用して、送信エンドポイントでも ContentTypeDelegatingMessageConverter を使用できます。

次の例では、ContentTypeDelegatingMessageConverter を設定します。デフォルトのコンバーターは SimpleMessageConverter (Java 直列化とプレーンテキストを処理します)で、JSON コンバーターを使用します。

<amqp:outbound-channel-adapter id="withContentTypeConverter" channel="ctRequestChannel"
                               exchange-name="someExchange"
                               routing-key="someKey"
                               amqp-template="amqpTemplateContentTypeConverter" />

<int:channel id="ctRequestChannel"/>

<rabbit:template id="amqpTemplateContentTypeConverter"
        connection-factory="connectionFactory" message-converter="ctConverter" />

<bean id="ctConverter"
        class="o.s.amqp.support.converter.ContentTypeDelegatingMessageConverter">
    <property name="delegates">
        <map>
            <entry key="application/json">
                <bean class="o.s.amqp.support.converter.Jackson2JsonMessageConverter" />
            </entry>
        </map>
    </property>
</bean>

contentType ヘッダーを application/json に設定してメッセージを ctRequestChannel に送信すると、JSON コンバーターが選択されます。

これは、発信チャネルアダプターとゲートウェイの両方に適用されます。

バージョン 5.0 以降、発信メッセージの MessageProperties に追加されるヘッダーは、マップされたヘッダーによって上書きされることはありません(デフォルト)。以前は、これはメッセージコンバーターが ContentTypeDelegatingMessageConverter の場合のみでした(その場合、適切なコンバーターを選択できるようにヘッダーが最初にマップされました)。SimpleMessageConverter などの他のコンバーターの場合、マップされたヘッダーは、コンバーターによって追加されたヘッダーを上書きしました。これにより、送信メッセージに contentType ヘッダーが残っていて(おそらく受信チャネルアダプターから)、正しい送信 contentType が誤って上書きされたときに問題が発生しました。回避策は、メッセージを送信エンドポイントに送信する前にヘッダーフィルターを使用してヘッダーを削除することでした。

ただし、以前の動作が必要な場合があります。たとえば、JSON を含む String ペイロードの場合、SimpleMessageConverter はコンテンツを認識せず、contentType メッセージプロパティを text/plain に設定しますが、アプリケーションはそれを application/json にオーバーライドしたいと考えています。送信エンドポイントに送信されるメッセージの contentType ヘッダーを設定します。ObjectToJsonTransformer はまさにそれを行います(デフォルト)。

送信チャネルアダプターとゲートウェイ(および AMQP でバックアップされたチャネル)に headersMappedLast というプロパティが追加されました。これを true に設定すると、コンバーターによって追加されたプロパティを上書きする動作が復元されます。

バージョン 5.1.9 以降、同様の replyHeadersMappedLast が AmqpInboundGateway に対して提供されます。これは、応答を生成し、コンバーターによって入力されたヘッダーをオーバーライドする場合に使用されます。詳細については、JavaDocs を参照してください。