回覆內容型別
如果您正在使用複雜的訊息轉換器,例如 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
,這樣轉換器設定的任何值都將被保留。