我正在使用kafka产品和Spring kafka用户。我正在使用Json序列化器和反序列化器。每当我尝试从主题读取使用者中的消息时,都会出现以下错误:
org.apache.kafka.common.errors.SerializationException: Error deserializing key/value for partition fan_topic-0 at offset 154. If needed, please seek past the record to continue consumption.
Caused by: java.lang.IllegalStateException: No type information in headers and no default type provided
我既没有在生产者中也没有在消费者中配置有关标头的任何东西。我在这里想念什么?
答案 0 :(得分:3)
我相信您会错过这样一个事实,必须在 public static List<int> pageRangeToList(string pageRg, int Nmax = 0)
{
List<int> ls = new List<int>();
int lb,ub,i;
foreach (string ss in pageRg.Split(','))
{
if(int.TryParse(ss,out lb)){
ls.Add(Math.Abs(lb));
} else {
var subls = ss.Split('-').ToList();
lb = (int.TryParse(subls[0],out i)) ? i : 0;
ub = (int.TryParse(subls[1],out i)) ? i : Nmax;
ub = ub > 0 ? ub : lb; // if ub=0, take 1 value of lb
for(i=0;i<=Math.Abs(ub-lb);i++)
ls.Add(lb<ub? i+lb : lb-i);
}
}
Nmax = Nmax > 0 ? Nmax : ls.Max(); // real Nmax
return ls.Where(s => s>0 && s<=Nmax).ToList();
}
上配置JsonDeserializer
并使用适当的默认类型进行反序列化,而不是在Kafka属性中。
所有信息均在文档中显示:https://docs.spring.io/spring-kafka/docs/2.1.7.RELEASE/reference/html/_reference.html#serdes
答案 1 :(得分:0)
只需添加以上答案,
以下更改为我解决了。
config.put(JsonSerializer.ADD_TYPE_INFO_HEADERS, false);
添加
return new DefaultKafkaConsumerFactory<>(config, new StringDeserializer(), new JsonDeserializer<>(String.class));
代替
return new DefaultKafkaConsumerFactory<String, String>(config);
供参考,
deserialize
中的以下方法期望标题,而“ Assert.state..
”抛出IllegalStateException
@Override
public T deserialize(String topic, Headers headers, byte[] data) {
JavaType javaType = this.typeMapper.toJavaType(headers);
if (javaType == null) {
Assert.state(this.targetType != null, "No type information in headers and no default type provided");
return deserialize(topic, data);
}
else {
try {
return this.objectMapper.readerFor(javaType).readValue(data);
}
catch (IOException e) {
throw new SerializationException("Can't deserialize data [" + Arrays.toString(data) +
"] from topic [" + topic + "]", e);
}
}
}