java.lang.ClassCastException:xx无法转换为org.apache.avro.generic.IndexedRecord

8
我能够把我的Java Bean类作为Avro记录发布到Kafka。但是当我尝试消费时,会出现类转换异常。为什么会发生这种情况? 生产者
Schema schema = new Schema.Parser().parse(new File("/schemas/avro_schemas/test_schema.avsc"));

GenericRecord payload = new GenericData.Record(schema);
payload.put("name", fileName);
payload.put("timestamp", dateTime.toString());
payload.put("source", source);
payload.put("content", buf);
payload.put("customerCode", customercode); 
producer.publish(topic, payload, schema);

消费者

ConsumerIterator<byte[], byte[]> it = stream.iterator();
while (it.hasNext()) {
try {
byte[] received_message = it.next().message();
Schema  schema = new Schema.Parser().parse(new File("/schemas/avro_schemas/test_schema.avsc"));
DatumReader<GenericRecord> reader = new SpecificDatumReader<GenericRecord>(schema);
Decoder decoder = DecoderFactory.get().binaryDecoder(received_message, null);
GenericRecord   payload = reader.read(null, decoder);

异常

ava.lang.ClassCastException: com.xxx.File cannot be cast to org.apache.avro.generic.IndexedRecord

at org.apache.avro.generic.GenericData.setField(GenericData.java:573)

at org.apache.avro.generic.GenericData.setField(GenericData.java:590)

at org.apache.avro.generic.GenericDatumReader.readField(GenericDatumReader.java:193)

at org.apache.avro.generic.GenericDatumReader.readRecord(GenericDatumReader.java:183)

at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:151)

at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:142)

at com.xxx.listener.KafkaMessageListenerThread.run(KafkaMessageListenerThread.java:56)

at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)

at java.util.

Avro架构

{
    "namespace": "com.xx"
     "type": "record",
     "name": "File",
     "fields":[
         {
            "name": "name", "type": "string"
         },
         {
            "name": "timestamp",  "type": "string"
         },
         {
            "name": "source", "type": "string"
         },
         {
            "name": "content", "type": "bytes"
         },
         {
            "name": "customerCode", "type": "string"
         }
     ]
}

可能是一个打字错误?在模式中名称空间是com.xx,但异常写成了com.xxx.File。 - Patrick
我认为它使用“name”字段选择命名空间。 - Ratha
3
@Patrick,我修复了这个问题,将SpecificDatumReader更改为GenericDatumReader。 - Ratha
1个回答

1
尝试使用org.apache.avro.reflect.ReflectDatumReader代替org.apache.avro.specific.SpecificDatumReader

你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community
这并没有回答问题。一旦您拥有足够的声望,您将能够评论任何帖子;相反,提供不需要询问者澄清的答案。- 来自审核 - Andres Gardiol

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接