Jackson2JsonMessageConverter 不适用于rabbitmq

Guo*_*ang 1 spring rabbitmq spring-amqp

我使用以下代码进行消息转换器:

SimpleMessageListenerContainer container(ConnectionFactory  connectionFactory, Queue queue,
        MessageListenerAdapter listenerAdapter) {

    SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
    container.setConnectionFactory(connectionFactory);
    container.setQueueNames(queue.getName());
    container.setMessageListener(listenerAdapter);
    container.setMessageConverter(new Jackson2JsonMessageConverter());
    return container;
}
Run Code Online (Sandbox Code Playgroud)

我的听众被宣布:

public void receiveMessage(List<Map<String, Object>> message) {
    try {
        System.out.println("Received <" + new String(message, "UTF-8") +     ">");
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
}
Run Code Online (Sandbox Code Playgroud)

但它总是尝试给出以下错误:

Failed to invoke target method 'receiveMessage' with argument type = [class [B], value = [{[B@40c2d9c5}]","at org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter.invokeListenerMethod(MessageListenerAdapter.java:408)
Run Code Online (Sandbox Code Playgroud)

它似乎尝试调用 byte[] 作为参数,而不是将 json 字符串转换为 List>。

Gar*_*ell 5

转换器需要content_type包含令牌的消息属性json- 例如application/json。如果您使用的版本至少为 1.6.1,则应该会看到 WARN 日志。

log.warn("Could not convert incoming message with content-type ["
        + contentType + "], 'json' keyword missing.");
Run Code Online (Sandbox Code Playgroud)

如果您无法更改生产者以正确设置内容类型,您可以对转换器进行子类化...

@Override
public Object fromMessage(Message message, Object conversionHint) throws MessageConversionException {
    message.getMessageProperties().setContentType("application/json");
    return super.fromMessage(message, conversionHint);
}
Run Code Online (Sandbox Code Playgroud)