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

Kafka Streams示例运行抛出java.lang.IllegalArgumentException: Data should be null for a VoidDeserializer异常的解决咨询

解决Kafka Streams中VoidDeserializer的IllegalArgumentException问题

问题原因

你遇到的java.lang.IllegalArgumentException: Data should be null for a VoidDeserializer.异常,核心原因很明确:你配置了Key的Serde为Void类型,但你的"users"主题里的消息实际带有非null的Key(示例里的Key是User_8)。

Serdes.Void()对应的VoidDeserializer是专门用来处理值为null的Key数据的,当它收到非null的Key字节数据时,就会触发这个错误提示。

解决方案

根据你的实际需求,有两种可行的处理方式:

1. 需要使用消息的Key(推荐,因为主题本身存在Key)

修改代码中Key的Serde配置和KStream的泛型,匹配实际Key的字符串类型:

  • 调整KStream的泛型声明:

    // 把<Void, String>改为<String, String>,对应实际Key的字符串类型
    KStream<String, String> stream = builder.stream("users");
    
  • 修改Key的Serde配置:

    // 把Serdes.Void()替换为Serdes.String()
    config.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_CONFIG, Serdes.String().getClass());
    

修改后,Kafka Streams就能正确反序列化主题中的Key了,你也可以在foreach操作里正常使用这个Key(如果业务需要的话)。

2. 不需要使用消息的Key

如果你确实不需要处理这个Key,也不能继续用Void Serde(因为实际Key非null),同样需要用Serdes.String()作为Key的Serde,只是在处理逻辑中忽略Key即可:

KStream<String, String> stream = builder.stream("users");
stream.foreach( (key, value) -> {
    // 忽略key,只处理value
    System.out.println("(DSL) Hello, " + value);
});

验证修改

完成上述调整后重新运行代码,就能正常消费"users"主题的消息,不会再触发VoidDeserializer的异常了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 13:52:36