Reply ContentType

如果你正在使用成熟的消息转换器,如`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<?>`时,这些属性(`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`,并且转换器设置的任何值都将被保留。