回覆內容類型

如果您使用複雜的訊息轉換器,例如 ContentTypeDelegatingMessageConverter,您可以透過在監聽器上設定 replyContentType 屬性來控制回覆的內容類型。這可讓轉換器為回覆選擇適當的委派轉換器。

@RabbitListener(queues = "q1", messageConverter = "delegating",
        replyContentType = "application/json")
public Thing2 listen(Thing1 in) {
    ...
}

預設情況下,為了向後相容性,轉換器設定的任何內容類型屬性都會在轉換後被此值覆寫。諸如 SimpleMessageConverter 之類的轉換器使用回覆類型而非內容類型來判斷所需的轉換,並在回覆訊息中適當地設定內容類型。這可能不是所需的行為,並且可以透過將 converterWinsContentType 屬性設定為 false 來覆寫。例如,如果您傳回包含 JSON 的 StringSimpleMessageConverter 會將回覆中的內容類型設定為 text/plain。即使使用 SimpleMessageConverter,以下配置也將確保正確設定內容類型。

@RabbitListener(queues = "q1", replyContentType = "application/json",
        converterWinsContentType = "false")
public String listen(Thing in) {
    ...
    return someJsonString;
}

當回傳類型為 Spring AMQP Message 或 Spring Messaging Message<?> 時,這些屬性 (replyContentTypeconverterWinsContentType) 不適用。在第一種情況下,不涉及轉換;只需設定 contentType 訊息屬性。在第二種情況下,行為由訊息標頭控制。

@RabbitListener(queues = "q1", messageConverter = "delegating")
@SendTo("q2")
public Message<String> listen(String in) {
    ...
    return MessageBuilder.withPayload(in.toUpperCase())
            .setHeader(MessageHeaders.CONTENT_TYPE, "application/xml")
            .build();
}

此內容類型將在 MessageProperties 中傳遞給轉換器。預設情況下,為了向後相容性,轉換器設定的任何內容類型屬性都會在轉換後被此值覆寫。如果您希望覆寫該行為,也請將 AmqpHeaders.CONTENT_TYPE_CONVERTER_WINS 設定為 true,並且轉換器設定的任何值都將被保留。