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

David Carr commented on AVRO-1870:
----------------------------------

Having SpecificData extend GenericData, and GenericDatumWriter accept 
GenericData objects as the API signature, is a form of claiming that they 
should work together.  Doing otherwise is a violation of polymorphism.

That being said, if that's the direction we're going down, I don't see the 
point in having every client who hits this case needing to write our own 
implementation of the detection of specific vs. generic.  It would be better to 
provide that as a feature of the Avro Java API.  Perhaps we could add a 
"TrulyGenericDatumWriter".  :-)

> Avro compiler generate JAVA enum interfaces but writeEnum expects 
> GenericEnumSymbol
> -----------------------------------------------------------------------------------
>
>                 Key: AVRO-1870
>                 URL: https://issues.apache.org/jira/browse/AVRO-1870
>             Project: Avro
>          Issue Type: Bug
>          Components: java
>    Affects Versions: 1.8.1
>            Reporter: Ali Hashemi
>
> Avro compiler generate an enum JAVA class from an enum Avro type 
> and this class is used in the Java class of the records pointing to the enum 
> type. However, org.apache.avro.generic.GenericDatumWriter.writeEnum expects a 
> GenericEnumSymbol rather than Java Enum!
> This is problem because the class interfaces for Avro messages expect Java 
> Enum and not GenericEnumSymbol!
> Consider the following schema:
> TrafficLights.avsc:
> {"namespace": "com.comp.message",
>  "type": "record",
>  "name": "TrafficLights",
>  "fields": [
>         {"name": "id",  "type": "string"},
>         {"name": "signal",  "type": "Signals" }
>  ]
> }
> Signals.avsc:
> {
>    "namespace": "com.comp.message",
>    "type": "enum",
>    "name":"Signals",
>    "symbols" : ["GREEN", "YELLOW", "RED"]
> }
> Using maven-avro-plugin to import "Signals" as an external schema, Avro 
> compiler creates the following constructor for TrafficLights class:
> public TrafficLights(java.lang.CharSequence id, com.comp.message.Signals 
> signal){...}
> and an Enum class fot the Signals:
> package com.comp.message;
> @SuppressWarnings("all")
> @org.apache.avro.specific.AvroGenerated
> public enum Signals {
>   GREEN, YELLOW, RED  ;
>   public static final org.apache.avro.Schema SCHEMA$ = new 
> org.apache.avro.Schema.Parser().parse("{\"type\":\"enum\",\"name\":\"Signals\",\"namespace\":\"com.comp.message\",\"symbols\":[\"GREEN\",\"YELLOW\",\"RED\"]}");
>   public static org.apache.avro.Schema getClassSchema() { return SCHEMA$; }
> }
> However, when I try to serialize a TrafficLights message, 
> GenericDatumWriter.writeEnum throws an exeception:
> TrafficLights  mainTrafficLight = new TrafficLights  ("123",  Signals.GREEN);
> byte[] msg = new AvroMsgManager( mainTrafficLight .getSchema().toString() 
> ).serialize (mainTrafficLight))
> org.apache.avro.AvroTypeException: Not an enum: GREEN
>         at 
> org.apache.avro.generic.GenericDatumWriter.writeEnum(GenericDatumWriter.java:164)
>         at 
> org.apache.avro.generic.GenericDatumWriter.writeWithoutConversion(GenericDatumWriter.java:106)
>         at 
> org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:73)
>         at 
> org.apache.avro.generic.GenericDatumWriter.writeField(GenericDatumWriter.java:153)
>         at 
> org.apache.avro.generic.GenericDatumWriter.writeRecord(GenericDatumWriter.java:143)
>         at 
> org.apache.avro.generic.GenericDatumWriter.writeWithoutConversion(GenericDatumWriter.java:105)
>         at 
> org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:73)
>         at 
> org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:60)



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to