Avro nested type java.lang.ClassCastException: org.apache.avro.generic.GenericData$Record cannot be cast to -


when try decode avro records following schema following error:

{   "type":"record",   "name":"example",   "namespace":"com.example.test",   "fields":[     {         "name":"nestedexample",         "type":{             "type":"record",             "name":"nestedexample",             "namespace":"com.example.test.example$",             "fields":[]         }     }   ] } 

java.lang.classcastexception: org.apache.avro.generic.genericdata$record cannot cast com.example.test.example$.nestedexample @ com.example.test.example.put(example.java:40) @ org.apache.avro.generic.genericdata.setfield(genericdata.java:573) @ org.apache.avro.generic.genericdata.setfield(genericdata.java:590) @ org.apache.avro.generic.genericdatumreader.readfield(genericdatumreader.java:193) @ org.apache.avro.generic.genericdatumreader.readrecord(genericdatumreader.java:183) @ org.apache.avro.generic.genericdatumreader.read(genericdatumreader.java:151) @ org.apache.avro.generic.genericdatumreader.read(genericdatumreader.java:142)

this appears related namespace of nested type. note: how avro reflection specifies namespace if reflection used on java class nested class. if change namespace same example can decode records fine. how can decode records have nested record types when nested record types in own namespace?

i generating java classes using avro maven plugin. avro version 1.7.7. here code using decode example record:

public class avro_nestedrecord {      list<example> examples;      @before     public void setup() throws exception {         examples = arrays.aslist(new example[] {                 example.newbuilder()                 .setnestedexample(new com.example.test.example$.nestedexample())                 .build()         });     }      @test     public void thisishowwecodespecificrecordsdirectly() throws ioexception {         schema schema = example.getclassschema();         // write         bytearrayoutputstream outputstream = new bytearrayoutputstream();         binaryencoder encoderinstance = encoderfactory.get().directbinaryencoder(outputstream, null);         specificdatumwriter<example> specificdatumwriter = new specificdatumwriter<example>(schema);         specificdatumwriter.write(examples.get(0), encoderinstance);         // read         bytearrayinputstream instream = new bytearrayinputstream(outputstream.tobytearray());         binarydecoder decoderinstance = decoderfactory.get().directbinarydecoder(instream, null);         specificdatumreader<example> specificdatumreader = new specificdatumreader<example>(schema);         specificdatumreader.read(null, decoderinstance);     } } 


Comments