通过RabbitMQ Web发JSON时Spring RabbitListener报LinkedHashMap错误如何解决
问题根因
Spring AMQP默认使用SimpleMessageConverter处理消息,当你通过RabbitMQ Web端发送JSON格式的邮件消息时,如果没有配置专门的JSON消息转换器,框架会默认将JSON内容反序列化为java.util.LinkedHashMap类型,和你@RabbitListener监听方法定义的自定义邮件实体参数类型不匹配,就会抛出该异常。
解决方案
方案1:配置全局JSON消息转换器
直接在Spring配置类中注册Jackson2JsonMessageConverterBean,框架会自动用该转换器将JSON消息直接反序列化为监听方法参数对应的实体类型,无需额外手动转换:import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter; import org.springframework.amqp.support.converter.MessageConverter; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class RabbitMqConfig { @Bean public MessageConverter jsonMessageConverter() { return new Jackson2JsonMessageConverter(); } }方案2:调整监听方法参数手动转换
若不想修改全局配置,可以直接将监听方法的入参类型改为LinkedHashMap,再手动转为自定义邮件实体类:import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.util.LinkedHashMap; @Component public class MailMessageListener { @Resource private ObjectMapper objectMapper; @RabbitListener(queues = "你的实际邮件队列名称") public void handleMailMessage(LinkedHashMap<String, Object> messageMap) { // 手动转换为自定义的MailDTO实体类 MailDTO mailDTO = objectMapper.convertValue(messageMap, MailDTO.class); // 后续处理邮件发送的业务逻辑 } }方案3:RabbitMQ Web端发送时补充消息头
在Web管理界面发送消息时,在properties配置区域新增content_type属性,值设置为application/json,配合方案1的全局JSON转换器使用,适配效果更稳定。
注意事项
- 自定义的邮件实体类需要保留无参构造方法,否则Jackson反序列化会报错
- 如果实体类包含特殊格式字段(如日期、枚举),可通过
@JsonFormat、@JsonEnum等Jackson注解做序列化适配
内容的提问来源于stack exchange,提问作者Dariya
相关产品推荐
相关产品推荐

