跳到主要内容
版本:7.0.2

出站消息转换

DeepSeek V3 中英对照 Outbound Message Conversion

Spring AMQP 1.4 引入了 ContentTypeDelegatingMessageConverter,该转换器会根据传入消息的 content type 属性选择实际的转换器。入站端点可以使用此功能。

自 Spring Integration 4.3 版本起,您也可以在出站端点上使用 ContentTypeDelegatingMessageConverter,通过 contentType 头部来指定使用哪个转换器。

以下示例配置了一个 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>

ctRequestChannel 发送消息时,若将 contentType 标头设置为 application/json,则会选择 JSON 转换器。

这适用于出站通道适配器和网关。

备注

从版本 5.0 开始,添加到出站消息 MessageProperties 中的头部永远不会被映射的头部覆盖(默认情况下)。在此之前,仅当消息转换器是 ContentTypeDelegatingMessageConverter 时才会如此(在这种情况下,头部会先被映射,以便选择合适的转换器)。对于其他转换器,例如 SimpleMessageConverter,映射的头部会覆盖转换器添加的任何头部。当出站消息中残留了一些 contentType 头部(可能来自入站通道适配器)并且正确的出站 contentType 被错误地覆盖时,这会导致问题。解决方法是使用头部过滤器在将消息发送到出站端点之前移除该头部。

然而,在某些情况下,可能需要之前的行为——例如,当包含 JSON 的 String 负载时,SimpleMessageConverter 无法识别内容,并将 contentType 消息属性设置为 text/plain,但您的应用程序可能希望通过设置发送到出站端点的消息的 contentType 头部来将其覆盖为 application/jsonObjectToJsonTransformer 默认情况下正是这样做的。

现在,出站通道适配器和网关(以及基于 AMQP 的通道)上有一个名为 headersMappedLast 的属性。将其设置为 true 可以恢复覆盖转换器添加的属性的行为。

从版本 5.1.9 开始,AmqpInboundGateway 在生成回复并希望覆盖转换器填充的头部时,提供了类似的 replyHeadersMappedLast 属性。更多信息请参阅其 Javadocs。