使用 ContentTypeDelegatingMessageConverter 的 RabbitListener Spring AMQP 中的内容类型不同

Content type different in RabbitListener Spring AMQP using ContentTypeDelegatingMessageConverter

实际上我正在使用 Spring AMQP 从 Rabbit 使用 XML。

这是我的监听队列代码。

  @RabbitListener(queues = DealerReceiverConfig.P8_QUEUE_NAME, id = Constants.P8_QUEUE_ID)
@SendTo("foo.bar")
public RequestDocument p8ContentReceiveMessage(RequestDocument request) {

System.out.println(request.getCorrelationId());

return request;

}

我的兔子模板配置是:

@Override
@Bean(name = "dealerRabbit")
public RabbitTemplate rabbitTemplateSeguros(ConnectionFactory connectionFactory) {
RabbitTemplate template = new RabbitTemplate(connectionFactory);
template.setMessageConverter(producerMessageConverter());
return template;
}

@Override
@Bean
public MessageConverter producerMessageConverter() {

ContentTypeDelegatingMessageConverter messageConverter = new ContentTypeDelegatingMessageConverter();

Jackson2JsonMessageConverter jsonMessageConverter = new Jackson2JsonMessageConverter();
messageConverter.addDelegate("application/json", jsonMessageConverter);

MarshallingMessageConverter marshaller = new MarshallingMessageConverter();
marshaller.setMarshaller(oxmMarshaller());
marshaller.setUnmarshaller(oxmUnMarshaller());
messageConverter.addDelegate("application/xml", marshaller);

return messageConverter;
}

@Bean
public Marshaller oxmMarshaller() {

Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
marshaller.setPackagesToScan("foo.bar.model");
return marshaller;

}


@Bean
public Unmarshaller oxmUnMarshaller() {

Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
marshaller.setPackagesToScan("foo.bar.model");
return marshaller;

}

问题是当我在配置的@SentTo 队列中看到返回的消息时,我收到以下消息。

Returned message

有什么建议吗?

感谢您的帮助。

该模板不用于发送来自 @RabbitListener 的回复;您需要将转换器添加到 RabbitListenerContainerFactorySimple...Direct...,具体取决于您使用的容器类型)。

编辑

这是一个错误;你应该能够做到这一点...

    @RabbitListener(queues = "foo")
    @SendTo("bar")
    public Message<String> listen(String in) {
        System.out.println(in);
        return MessageBuilder.withPayload(in.toUpperCase())
                .setHeader(MessageHeaders.CONTENT_TYPE, "application/xml")
                .build();
    }

但适配器仍使用原始 MessageProperties,其中 application/x-java-serialized-object 作为默认 CT。

https://github.com/spring-projects/spring-amqp/issues/1219