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
相关产品推荐
相关产品推荐

