Allan Wax created AVRO-2190:
-------------------------------

             Summary: ReflectData...getSchema() produces bad output for 
abstract java classes
                 Key: AVRO-2190
                 URL: https://issues.apache.org/jira/browse/AVRO-2190
             Project: Avro
          Issue Type: Bug
          Components: java
    Affects Versions: 1.8.2
         Environment: The working environment is Windows 10 with java 1.8 92 
but I suspect this code will work on all systems.
            Reporter: Allan Wax


ReflectData produces 'invalid' type entries for Abstract objects.  An example 
is InetAddress.  What it produces is valid JSON but the schema cannot be used 
to deserialize/read the serialized/write output.  ReflectData produces is

{{{"type":"record","name":"InetAddress","namespace":"java.net","fields":[]}}}

but it should notice that InetAddress is an _abstract_ class and go find the 
classes that extend the class.

{{{"type":"record","name":"Inet4Address","namespace":"java.net","fields":[]},\{"type":"record","name":"Inet6Address","namespace":"java.net","fields":[]}}}

 

I have a current workaround for this with the following, but it is a little 
hacky and not that efficient if used alot.

{color:#000080}private static {color}String {color:#660e7a}abstractInetAddress 
{color}= 
{color:#008000}"{{color}{color:#000080}\"{color}{color:#008000}type{color}{color:#000080}\"{color}{color:#008000}:{color}{color:#000080}\"{color}{color:#008000}record{color}{color:#000080}\"{color}{color:#008000},{color}{color:#000080}\"{color}{color:#008000}name{color}{color:#000080}\"{color}{color:#008000}:{color}{color:#000080}\"{color}{color:#008000}InetAddress{color}{color:#000080}\"{color}{color:#008000},{color}{color:#000080}\"{color}{color:#008000}namespace{color}{color:#000080}\"{color}{color:#008000}:{color}{color:#000080}\"{color}{color:#008000}java.net{color}{color:#000080}\"{color}{color:#008000},{color}{color:#000080}\"{color}{color:#008000}fields{color}{color:#000080}\"{color}{color:#008000}:[]}"{color};


{color:#000080}private static {color}String 
{color:#660e7a}abstractInetAddressReplacement {color}= {color:#808080}//
{color} 
{color:#008000}"{{color}{color:#000080}\"{color}{color:#008000}type{color}{color:#000080}\"{color}{color:#008000}:{color}{color:#000080}\"{color}{color:#008000}record{color}{color:#000080}\"{color}{color:#008000},{color}{color:#000080}\"{color}{color:#008000}name{color}{color:#000080}\"{color}{color:#008000}:{color}{color:#000080}\"{color}{color:#008000}Inet4Address{color}{color:#000080}\"{color}{color:#008000},{color}{color:#000080}\"{color}{color:#008000}namespace{color}{color:#000080}\"{color}{color:#008000}:{color}{color:#000080}\"{color}{color:#008000}java.net{color}{color:#000080}\"{color}{color:#008000},{color}{color:#000080}\"{color}{color:#008000}fields{color}{color:#000080}\"{color}{color:#008000}:[]}"
 {color}+ {color:#808080}//
{color} 
{color:#008000}",{{color}{color:#000080}\"{color}{color:#008000}type{color}{color:#000080}\"{color}{color:#008000}:{color}{color:#000080}\"{color}{color:#008000}record{color}{color:#000080}\"{color}{color:#008000},{color}{color:#000080}\"{color}{color:#008000}name{color}{color:#000080}\"{color}{color:#008000}:{color}{color:#000080}\"{color}{color:#008000}Inet6Address{color}{color:#000080}\"{color}{color:#008000},{color}{color:#000080}\"{color}{color:#008000}namespace{color}{color:#000080}\"{color}{color:#008000}:{color}{color:#000080}\"{color}{color:#008000}java.net{color}{color:#000080}\"{color}{color:#008000},{color}{color:#000080}\"{color}{color:#008000}fields{color}{color:#000080}\"{color}{color:#008000}:[]}"{color};

{color:#000080}public {color}AvroUtil(Class<{color:#20999d}T{color}> clazz) {
    {color:#660e7a}schema {color}= ReflectData.AllowNull.get().getSchema(clazz);
    String s = 
{color:#660e7a}schema{color}.toString().replace({color:#660e7a}abstractInetAddress{color},
 {color:#660e7a}abstractInetAddressReplacement{color});
    {color:#660e7a}schema {color}= {color:#000080}new 
{color}Schema.Parser().parse(s);

    {color:#000080}this{color}.{color:#660e7a}clazz {color}= clazz;
}

 



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

Reply via email to