Spring Boot Kafka消费JSON消息反序列化出现NullPointerException问题
问题原因分析
- 核心原因:Schema Registry实例未初始化
你抛出的空指针对应5.5.3版本KafkaJsonDeserializer第74行代码,该行调用Schema Registry实例的方法获取Schema,当实例未初始化时就会触发空指针,触发该问题的常见场景如下:- 未配置Schema Registry地址
Confluent官方的KafkaJsonSerializer/KafkaJsonDeserializer默认绑定Schema Registry使用,你的现有配置中缺失schema.registry.url参数,导致反序列化器初始化时没有生成合法的Schema Registry客户端实例。 - Schema Registry配置项拼写错误
若你已经加了相关配置,但配置Key写错(比如误写为schemaRegistry.url、schema-registry-url等),反序列化器无法读取到有效地址,同样会导致实例为空。 - 消息格式不匹配
若生产者开启了Schema Registry能力、但消费者未开启,消费时无法解析消息头中的Schema ID,也会触发空指针异常。
- 未配置Schema Registry地址
Schema必要性说明
使用该套序列化/反序列化器不强制必须提供Schema,取决于你的配置:
- 默认配置下
json.use.schema.registry = true,必须对接Confluent Schema Registry,消息生产时会自动注册JSON Schema到Registry,消费时根据消息携带的Schema ID拉取Schema做反序列化,该场景下必须依赖Schema。 - 若将配置项
json.use.schema.registry设为false,则不需要对接Schema Registry,也不需要提前定义Schema,仅需消费者配置json.value.type指定反序列化的目标Java类即可,底层直接通过Jackson完成普通JSON的序列化/反序列化。
解决方案
方案1:对接Schema Registry(推荐)
在消费者配置中补充Schema Registry地址即可:
// 替换为实际部署的Schema Registry服务地址 props.put("schema.registry.url", "http://127.0.0.1:8081");
方案2:不使用Schema Registry
生产者和消费者都补充以下配置:
// 生产者新增配置 props.put("json.use.schema.registry", false); // 消费者新增配置 props.put("json.use.schema.registry", false); // 替换为实际的消息实体类全路径 props.put("json.value.type", "com.yourpackage.YourMessageDTO");
内容的提问来源于stack exchange,提问作者A Garg
相关产品推荐
相关产品推荐

