You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@avro.apache.org by "Doug Cutting (JIRA)" <ji...@apache.org> on 2018/02/22 16:33:00 UTC

[jira] [Commented] (AVRO-2149) Using GenericDatumWriter for writing GenericRecord with schema from the specified generated type

    [ https://issues.apache.org/jira/browse/AVRO-2149?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16373035#comment-16373035 ] 

Doug Cutting commented on AVRO-2149:
------------------------------------

By "generated type" you mean an enum class definition generated by Avro's specific compiler?  If so, then you should use SpecificDatumReader instead.  GenericDatumReader works for the generic data model.  SpecificDatumReader works for classes generated by the specific compiler (and generic data, because it inherits from GenericDatumReader).  ReflectDatumReader works for most POJO classes (plus specific & generic).

> Using GenericDatumWriter for writing GenericRecord with schema from the specified generated type
> ------------------------------------------------------------------------------------------------
>
>                 Key: AVRO-2149
>                 URL: https://issues.apache.org/jira/browse/AVRO-2149
>             Project: Avro
>          Issue Type: Improvement
>          Components: java
>    Affects Versions: 1.8.2
>            Reporter: Wojciech Sroka
>            Priority: Major
>
> Currently using GenericDatumWriter for writing GenericRecord with schema from the specified generated type cause exception when one of fields is enum type:
> {code:java}
> Exception in thread "main" org.apache.avro.file.DataFileWriter$AppendWriteException: org.apache.avro.AvroTypeException: Not an enum: YELLOW
> at org.apache.avro.file.DataFileWriter.append(DataFileWriter.java:308)
> at pl.ingbank.kafka.AvroErrorTester.runGenericWriterReaderTest(AvroErrorTester.java:65)
> at pl.ingbank.kafka.AvroErrorTester.main(AvroErrorTester.java:27)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
> at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> at java.lang.reflect.Method.invoke(Method.java:498)
> at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
> Caused by: org.apache.avro.AvroTypeException: Not an enum: YELLOW
> at org.apache.avro.generic.GenericDatumWriter.writeEnum(GenericDatumWriter.java:195)
> at org.apache.avro.generic.GenericDatumWriter.writeWithoutConversion(GenericDatumWriter.java:128)
> at org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:75)
> at org.apache.avro.generic.GenericDatumWriter.writeField(GenericDatumWriter.java:177)
> at org.apache.avro.generic.GenericDatumWriter.writeRecord(GenericDatumWriter.java:167)
> at org.apache.avro.generic.GenericDatumWriter.writeWithoutConversion(GenericDatumWriter.java:118)
> at org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:75)
> at org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:62)
> at org.apache.avro.file.DataFileWriter.append(DataFileWriter.java:302)
> ... 7 more{code}
> It is caused by method protected void writeEnum(Schema schema, Object datum, Encoder out) in class org.apache.avro.generic.GenericDatumWriter:
> {code:java}
>   protected void writeEnum(Schema schema, Object datum, Encoder out) throws IOException {
>     if (!data.isEnum(datum)) {
>       throw new AvroTypeException("Not an enum: " + datum);
>     }
>     out.writeEnum(schema.getEnumOrdinal(datum.toString()));
>   }{code}
> Fix for this is to add additional check does datum is enum type:
> {code:java}
> protected void writeEnum(Schema schema, Object datum, Encoder out) throws IOException {
>   if(datum.getClass().isEnum() && !data.isEnum(datum)){
>    throw new AvroTypeException("Not an enum: " + datum);
>   }
>   out.writeEnum(schema.getEnumOrdinal(datum.toString()));
> }
> {code}
> This fix alows to serialize and deserialize generic record with schema from the specified generated type.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)