You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Cloud Stream Rabbit Binder POJO序列化异常:消费者无法接收JSON消息

问题分析与解决方案

核心问题在于生产者未正确配置输出绑定的content-type,且发送的simulatePf-out-0绑定在配置中完全缺失,导致Spring Cloud Stream默认采用Java序列化(application/x-java-serialized-object)而非JSON格式,最终消费者无法解析POJO。


1. 修正生产者绑定配置

添加对应发送用的输出绑定simulatePf-out-0,明确指定content-type为application/json:

spring:
  autoconfigure:
    exclude: org.springframework.boot.actuate.autoconfigure.metrics.jdbc.DataSourcePoolMetricsAutoConfiguration
  application:
    name: simulator
  cloud:
    stream:
      function:
          definition: simulate1;simulate2
      rabbit:
        type: rabbit
        environment:
          spring:
            rabbitmq:
              host: localhost
              port: 5672
              username: guest
              password: guest
      # Kafka配置保留,不影响RabbitMQ使用
      kafka:
        binder:
          replicationFactor: 2
          auto-create-topics: true
          brokers: localhost:9092, localhost:9093, localhost:9094
          consumer-properties:
            key.deserializer: org.apache.kafka.common.serialization.StringDeserializer
            value.deserializer: org.springframework.kafka.support.serializer.JsonDeserializer
            spring:
              json:
                trusted:
                  packages: '*'
          configuration:
            value.deserializer: org.springframework.kafka.support.serializer.ErrorHandlingDeserializer
            key.deserializer: org.springframework.kafka.support.serializer.ErrorHandlingDeserializer
      bindings:
        # 原有输入绑定保留
        simulate1-in-0:
          destination: pf-topic
          content-type: application/json
          group: service
          binder: rabbit
          consumer:
            use-native-decoding: true
            concurrency: 5
        simulate2-in-0:
              destination: pf-topic
              content-type: application/json
              group: service
              binder: rabbit
              consumer:
                use-native-decoding: true
                concurrency: 5
        # 添加输出绑定配置,对应发送的simulatePf-out-0
        simulatePf-out-0:
          destination: pf-topic
          content-type: application/json
          binder: rabbit

2. 发送消息时显式指定Content-Type(可选)

如果不想依赖绑定配置,可在发送消息时直接设置Content-Type头,确保序列化格式正确:

import org.springframework.http.MediaType;
import org.springframework.messaging.support.MessageBuilder;

// ...

Message message1 = MessageBuilder.withPayload(new PFSimulationEvent(1, "sd"))
        .setHeader("to_process", true)
        .setHeader(org.springframework.cloud.stream.messaging.MessageHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
        .build();
output.send("simulatePf-out-0", message1);

3. 消费者端配置调整

消费者需关闭use-native-decoding(让Spring Cloud Stream自动处理JSON反序列化),并确保绑定配置匹配:

# 消费者应用配置示例
spring:
  cloud:
    stream:
      bindings:
        simulatePf-in-0:
          destination: pf-topic
          content-type: application/json
          group: simulation
          binder: rabbit
          consumer:
            concurrency: 5
            # 关闭native解码,由Spring Cloud Stream处理JSON转换
            use-native-decoding: false

同时,确保PFSimulationEvent满足反序列化要求:

  • 提供无参构造函数
  • 所有字段有对应的getter/setter
  • 可添加@JsonIgnoreProperties(ignoreUnknown = true)避免未知字段报错

4. 关键排查点

出现Java序列化的根本原因是Spring Cloud Stream找不到对应content-type的转换器,需确认:

  • 项目中已包含Jackson依赖(Spring Boot Web Starter默认自带,否则手动引入com.fasterxml.jackson.core:jackson-databind)
  • 输出绑定的content-type配置未遗漏

内容的提问来源于stack exchange,提问作者user725455

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 01:35:27