回覆內容類型
如果您使用複雜的訊息轉換器,例如 ContentTypeDelegatingMessageConverter
,您可以透過在監聽器上設定 replyContentType
屬性來控制回覆的內容類型。這可讓轉換器為回覆選擇適當的委派轉換器。
@RabbitListener(queues = "q1", messageConverter = "delegating",
replyContentType = "application/json")
public Thing2 listen(Thing1 in) {
...
}
預設情況下,為了向後相容性,轉換器設定的任何內容類型屬性都會在轉換後被此值覆寫。諸如 SimpleMessageConverter
之類的轉換器使用回覆類型而非內容類型來判斷所需的轉換,並在回覆訊息中適當地設定內容類型。這可能不是所需的行為,並且可以透過將 converterWinsContentType
屬性設定為 false
來覆寫。例如,如果您傳回包含 JSON 的 String
,SimpleMessageConverter
會將回覆中的內容類型設定為 text/plain
。即使使用 SimpleMessageConverter
,以下配置也將確保正確設定內容類型。
@RabbitListener(queues = "q1", replyContentType = "application/json",
converterWinsContentType = "false")
public String listen(Thing in) {
...
return someJsonString;
}
當回傳類型為 Spring AMQP Message
或 Spring Messaging Message<?>
時,這些屬性 (replyContentType
和 converterWinsContentType
) 不適用。在第一種情況下,不涉及轉換;只需設定 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
,並且轉換器設定的任何值都將被保留。