回复内容类型
如果您使用的是复杂的消息转换器,例如 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
,转换器设置的任何值都将保留。