如何在Spring Boot中使用KafkaTemplate发送和接收JSON格式的消息?

5 阅读3分钟

Spring Boot 使用 KafkaTemplate 发送/接收 JSON 消息(超详细)

这是企业最常用的用法:发送Java对象 → JSON字符串,接收JSON → Java对象,全程自动序列化/反序列化,不用手动处理。

一、核心原理

  1. 生产者:把 Java对象 自动序列化为 JSON 发送到 Kafka
  2. 消费者:从 Kafka 读取 JSON 自动反序列化为 Java对象
  3. 依赖 Spring 自带的 ​​Jackson​​ 实现 JSON 转换,无需额外包

二、完整步骤(直接复制可用)

1. Maven 依赖(不变)

<dependency>
    <groupId>org.springframework.kafka</groupId>
    <artifactId>spring-kafka</artifactId>
</dependency>

2. application.yml 配置(关键:JSON 序列化)

必须修改序列化器为 JSON 格式

spring:
  kafka:
    bootstrap-servers: localhost:9092

    # 生产者:发送 JSON
    producer:
      key-serializer: org.apache.kafka.common.serialization.StringSerializer
      # 发送对象自动转 JSON
      value-serializer: org.springframework.kafka.support.serializer.JsonSerializer
      acks: 1

    # 消费者:接收 JSON 转对象
    consumer:
      group-id: json-group
      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      # 接收 JSON 自动转对象
      value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer
      # 自动从头消费
      auto-offset-reset: earliest
      # 告诉反序列化器 要转成的目标包路径(必须配置)
      properties:
        spring.json.trusted.packages: com.example.demo.entity

✅ 重点:​​spring.json.trusted.packages​​ 填写你的实体类所在包名


3. 创建消息实体类(用于 JSON 转换)

创建一个普通 Java 实体(发送/接收共用这个类)

package com.example.demo.entity;

public class UserMessage {
    private Long id;
    private String name;
    private Integer age;
    private String content;

    // 必须有无参构造 + getter/setter
    public UserMessage() {}

    // getter & setter
    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public Integer getAge() { return age; }
    public void setAge(Integer age) { this.age = age; }
    public String getContent() { return content; }
    public void setContent(String content) { this.content = content; }

    @Override
    public String toString() {
        return "UserMessage{" +
                "id=" + id +
                ", name='" + name + ''' +
                ", age=" + age +
                ", content='" + content + ''' +
                '}';
    }
}

4. 生产者:发送 JSON 对象

直接把 Java 对象 传给 ​​KafkaTemplate​​,自动转 JSON

package com.example.demo.producer;

import com.example.demo.entity.UserMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class JsonKafkaProducer {

    @Autowired
    private KafkaTemplate<String, UserMessage> kafkaTemplate;

    private static final String TOPIC = "json-topic";

    @GetMapping("/send-json")
    public String sendJsonMessage() {
        // 1. 构建 Java 对象
        UserMessage user = new UserMessage();
        user.setId(1001L);
        user.setName("张三");
        user.setAge(25);
        user.setContent("Spring Boot 发送 JSON 消息");

        // 2. 直接发送对象(自动转JSON)
        kafkaTemplate.send(TOPIC, user);

        return "JSON 消息发送成功:" + user;
    }
}

5. 消费者:接收 JSON 自动转对象

监听主题,直接接收 Java 对象,无需手动解析 JSON

package com.example.demo.consumer;

import com.example.demo.entity.UserMessage;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Service;

@Service
public class JsonKafkaConsumer {

    private static final String TOPIC = "json-topic";

    // 直接接收 UserMessage 对象
    @KafkaListener(topics = TOPIC, groupId = "json-group")
    public void consumeJsonMessage(UserMessage userMessage) {
        System.out.println("==========================");
        System.out.println("收到 JSON 消息:");
        System.out.println("对象:" + userMessage);
        System.out.println("姓名:" + userMessage.getName());
        System.out.println("内容:" + userMessage.getContent());
        System.out.println("==========================");
    }
}

三、测试运行

  1. 先创建 JSON 主题(必须)
./bin/kafka-topics.sh --create --topic json-topic --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1
  1. 启动 Spring Boot
  2. 浏览器访问:
http://localhost:8080/send-json
  1. 查看控制台:直接打印出 Java 对象,成功!

四、高频问题解决

1. 反序列化报错:not trusted package

原因:没有配置信任包 解决:​​application.yml​​ 必须加:

properties:
  spring.json.trusted.packages: com.example.demo.entity

2. 发送/接收乱码/失败

  • 确保生产者序列化器 = JsonSerializer
  • 确保消费者反序列化器 = JsonDeserializer
  • 实体类必须有无参构造函数

3. 收不到消息

  • Topic 名称必须一致
  • 消费者组正确
  • Kafka 服务正常运行

五、极简总结(必记)

  1. 配置:生产者用 ​​JsonSerializer​​,消费者用 ​​JsonDeserializer​
  2. 发送:直接传 Java 对象,自动转 JSON
  3. 接收:直接接收 Java 对象,无需解析 JSON
  4. 安全:配置 ​​trusted.packages​​ 信任实体类包

这就是 Spring Boot + Kafka JSON 消息的标准企业用法,简单、稳定、通用!