Spring Boot 使用 KafkaTemplate 发送/接收 JSON 消息(超详细)
这是企业最常用的用法:发送Java对象 → JSON字符串,接收JSON → Java对象,全程自动序列化/反序列化,不用手动处理。
一、核心原理
- 生产者:把 Java对象 自动序列化为 JSON 发送到 Kafka
- 消费者:从 Kafka 读取 JSON 自动反序列化为 Java对象
- 依赖 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("==========================");
}
}
三、测试运行
- 先创建 JSON 主题(必须)
./bin/kafka-topics.sh --create --topic json-topic --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1
- 启动 Spring Boot
- 浏览器访问:
http://localhost:8080/send-json
- 查看控制台:直接打印出 Java 对象,成功!
四、高频问题解决
1. 反序列化报错:not trusted package
原因:没有配置信任包 解决:application.yml 必须加:
properties:
spring.json.trusted.packages: com.example.demo.entity
2. 发送/接收乱码/失败
- 确保生产者序列化器 = JsonSerializer
- 确保消费者反序列化器 = JsonDeserializer
- 实体类必须有无参构造函数
3. 收不到消息
- Topic 名称必须一致
- 消费者组正确
- Kafka 服务正常运行
五、极简总结(必记)
- 配置:生产者用
JsonSerializer,消费者用 JsonDeserializer - 发送:直接传 Java 对象,自动转 JSON
- 接收:直接接收 Java 对象,无需解析 JSON
- 安全:配置
trusted.packages 信任实体类包
这就是 Spring Boot + Kafka JSON 消息的标准企业用法,简单、稳定、通用!