【问题标题】:Jackson2JsonMessageConverter not work for rabbitmqJackson2JsonMessageConverter 不适用于rabbitmq
【发布时间】:2018-01-03 06:07:15
【问题描述】:

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

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

我的听众被宣布:

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

但它总是试图给出跟随错误:

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)

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

【问题讨论】:

    标签: spring rabbitmq spring-amqp


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 不清楚你不明白什么;我说创建Jackson2JsonMessageConverter 的子类并覆盖该方法,如图所示。否决一个明确的答案是不礼貌的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多