跳到主要内容
版本:4.1.1

回复 ContentType

Doubao 中英对照 Reply ContentType

如果你正在使用一个复杂的消息转换器,例如 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,这样转换器设置的任何值都会被保留。