返信 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;
}

これらのプロパティ (replyContentType および converterWinsContentType) は、戻り値の型が Spring AMQP Message または Spring Messaging Message<?> の場合は適用されません。最初のケースでは、変換は行われません。contentType メッセージプロパティを設定するだけです。2 番目のケースでは、動作はメッセージヘッダーを使用して制御されます。

@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 に設定すると、コンバーターによって設定された値が保持されます。