KafkaJsonSchemaSerializer序列化值含空字节前缀,配置是否遗漏?
问题分析与解决方案
你遇到的前缀字节是KafkaJsonSchemaSerializer默认添加的Schema Registry ID标识,这个序列化器是为Confluent Schema Registry设计的,会自动把Schema的ID(5字节前缀)+ 实际JSON内容一起发送,所以直接用Offset-Explorer查看原始消息时,会看到这些非JSON字节,导致JSON格式无效。
解决方向一:改用纯JSON序列化器(无需Schema Registry)
如果不需要Schema Registry的功能,直接换成Spring自带的JSON序列化器即可,发送的就是纯JSON字符串:
修改Spring配置中的value-serializer:
spring: kafka: producer: # 其他配置不变 value-serializer: org.springframework.kafka.support.serializer.JsonSerializer
可选添加Jackson自定义配置:
spring: kafka: producer: properties: spring.json.add.type.headers: false # 关闭类型头,避免额外字节插入
解决方向二:保留KafkaJsonSchemaSerializer但禁用Schema前缀
如果需要继续使用Schema Registry,但希望消息不带Schema ID前缀,需添加序列化器配置参数:
spring: kafka: producer: # 其他配置不变 value-serializer: io.confluent.kafka.serializers.json.KafkaJsonSchemaSerializer properties: schema.registry.url: "你的Schema Registry地址" # 序列化器初始化必填 # 关键配置:关闭Schema ID前缀写入 write.schema.id: false # 可选配置 auto.register.schemas: false json.value.serializer.pretty: true
额外说明
你的KafkaProducerConfiguration配置类没有问题,修改后的配置属性会被buildProperties(null)正确读取并应用到ProducerFactory中。另外,如果不想修改代码,也可以在Offset-Explorer中配置Schema Registry地址,工具会自动解析前缀并显示正常的JSON内容。
内容的提问来源于stack exchange,提问作者1Z10
相关产品推荐
相关产品推荐

