Spring Boot整合RabbitMQ消费者运行后POST请求报JSON解析异常
问题根因
报错核心是待解析的内容不是合法JSON:日志里显示待解析的字符串是TemplateRequest(templateField=abc),这是Lombok为TemplateRequest类生成的toString()方法输出结果,完全不符合JSON格式,Jackson自然无法解析。触发问题的具体原因有两点:
- 通道配置冲突:消费者模式下你将
template-channel通过@Input注解声明为输入(消费)通道,但消息发布网关TemplatePublishGateway配置的投递目标就是这个同名通道,相当于消息在应用本地直接被投递到了输入通道,跳过了Spring Cloud Stream默认的出站JSON序列化流程,原始Java对象直接流入通道,后续处理时直接取对象toString结果当JSON解析,直接触发异常。 - 生产者模式下只看到交换机看不到队列是正常现象:没有配置消费者组、没有消费者实例连接的情况下,Spring Cloud Stream不会自动创建绑定到交换机的队列。
修复步骤
不要复用同一个通道定义同时处理生产、消费逻辑,拆分输入输出通道即可解决:
- 重写通道定义接口,明确区分输入、输出通道,不要使用相同通道名:
public interface TemplateStreamChannel { String OUTPUT_NAME = "template-output"; String INPUT_NAME = "template-input"; @Output(OUTPUT_NAME) MessageChannel outputChannel(); @Input(INPUT_NAME) SubscribableChannel inputChannel(); }
- 修改消息网关配置,指定消息投递到输出通道:
@MessagingGateway public interface TemplatePublishGateway { @Gateway(requestChannel = TemplateStreamChannel.OUTPUT_NAME) void templatePublishRequest(@Payload TemplateRequest templateRequest, @Header("message") String message, @Header("processTime") Long processTime, @Header("type") String type); }
- 修改消费端监听器,指定监听输入通道:
@StreamListener(TemplateStreamChannel.INPUT_NAME) public void stateChannelHandler(@Payload String payload, @Header("message") String message, @Header("processTime") Long processTime, @Header("type") String type) throws JsonProcessingException { // 原有业务逻辑无需改动 }
- 在application配置中添加通道绑定规则,将输入、输出通道绑定到同一个RabbitMQ交换机,同时配置消费者组,启动后会自动创建绑定队列:
spring: cloud: stream: bindings: template-output: destination: template-exchange contentType: application/json template-input: destination: template-exchange group: template-consumer
- 所有标注
@EnableBinding的位置,将绑定的类替换为新的TemplateStreamChannel接口即可。
优化提示:你不需要在消费逻辑中手动使用ObjectMapper做反序列化,直接将监听器方法的payload参数类型声明为
TemplateRequest,Spring Cloud Stream会根据消息头的contentType自动完成JSON转对象的操作,减少冗余代码。
内容的提问来源于stack exchange,提问作者Nayana Pravalika
相关产品推荐
相关产品推荐

