Java.lang.IllegalGumentException使用Rabbittemplate发布消息时



我尝试在带有Rabbittemplate的队列上发布消息(使用Spring Boot),然后我收到了此消息。我已经尝试搜索解决方案。

Caused by: java.lang.IllegalArgumentException: SimpleMessageConverter only supports String, byte[] and Serializable payloads, received: com.example.demo.SimpleMessage

也许代码的这一部分可以帮助

@Override
    public void run(String...strings) throws Exception {
        SimpleMessage simpleMessage = new SimpleMessage();
        simpleMessage.setName("FirstMessage");
        simpleMessage.setDescription("simpleDescription");
        rabbitTemplate.convertAndSend("TestExchange", "testRouting", simpleMessage);
    }

我感谢任何合作。

问题是您的类SimpleMessage不实现Serializable

RabbitTemplate.convertAndSend使用SimpleMessageConveter将您的消息转换为AMQP消息。但是SimpleMessageConverter要求该消息实现接口Serializable

您的SimpleMessage类应该看起来像:

public class SimpleMessage implements Serializable {
    ... your code here
}

您可以在此处了解有关可序列化对象的更多信息。

还有另一个解决方案:使用MessageConverter的不同实现而不是默认的SimpleMessageConverter。

例如,jackson2jsonmessageconverter:

public RabbitTemplate jsonRabbitTemplate(ConnectionFactory connectionFactory, ObjectMapper mapper) {
    final var jsonRabbitTemplate = new RabbitTemplate(connectionFactory);
    jsonRabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter(mapper));
    return jsonRabbitTemplate;
}

在我的情况下,更改rabbittemplate的帮助。首先,我有一个:

@Bean
public RabbitTemplate rabbitTemplate() {
    return new RabbitTemplate(connectionFactory());
}

然后我将其更改为此:

@Bean
public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory, MessageConverter messageConverter) {
    RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
    rabbitTemplate.setMessageConverter(messageConverter);
    return rabbitTemplate;
}
@Bean
public MessageConverter messageConverter(ObjectMapper jsonMapper) {
    return new Jackson2JsonMessageConverter(jsonMapper);
}

最新更新