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