Kevin Burke created AVRO-4225:
---------------------------------

             Summary: GenericDatumReader throws ClassCastException for schemas 
with "java-class" attribute on string fields
                 Key: AVRO-4225
                 URL: https://issues.apache.org/jira/browse/AVRO-4225
             Project: Apache Avro
          Issue Type: Bug
    Affects Versions: 1.12.1
            Reporter: Kevin Burke


A minimal reproduction test case can be found here: 
https://github.com/apache/avro/pull/3616

When deserializing records using {{GenericDatumReader}} with schemas that have 
a {{"java-class"}} attribute on string fields (e.g., {{{}"java-class": 
"java.math.BigDecimal"{}}}), Avro throws a {{{}ClassCastException{}}}.

*Schema example:*

 

{{{
  "type": "record",
  "name": "TestRecord",
  "fields": [
    \{"name": "price", "type": ["null", {
      "type": "string",
      "java-class": "java.math.BigDecimal"
    }]}
  ]
}}}

*Stack trace:*

 

{{java.lang.ClassCastException: class org.apache.avro.util.Utf8 cannot be cast 
to class java.lang.String
    at 
org.apache.avro.io.FastReaderBuilder.lambda$getTransformingStringReader$32(FastReaderBuilder.java:440)
    at 
org.apache.avro.io.FastReaderBuilder.lambda$createUnionReader$30(FastReaderBuilder.java:412)
    at 
org.apache.avro.io.FastReaderBuilder.lambda$createFieldSetter$1(FastReaderBuilder.java:181)
    at 
org.apache.avro.io.FastReaderBuilder$RecordReader.read(FastReaderBuilder.java:575)
    at 
org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:150)}}

*Root cause:*

In {{FastReaderBuilder.getTransformingStringReader()}} (line 440), the code 
casts the result of {{stringReader.read()}} directly to {{{}String{}}}:

 

{{return (old, decoder) -> transformer.apply((String) stringReader.read(null, 
decoder));}}

However, when using {{{}GenericData{}}}, the string reader returns 
{{{}Utf8{}}}, not {{{}String{}}}. This causes the {{{}ClassCastException{}}}.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to