Skip to content

Commit 771d824

Browse files
AVRO-3791: Include field in readField AvroTypeException (#2420)
In order to bring more clarity and save users time error messages include the field avro fails to read. It is now immediately apparent which field in a record has issues that need correcting.
1 parent cea41a4 commit 771d824

File tree

3 files changed

+11
-4
lines changed

3 files changed

+11
-4
lines changed

lang/java/avro/src/main/java/org/apache/avro/generic/GenericDatumReader.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import java.util.function.Function;
2828

2929
import org.apache.avro.AvroRuntimeException;
30+
import org.apache.avro.AvroTypeException;
3031
import org.apache.avro.Conversion;
3132
import org.apache.avro.Conversions;
3233
import org.apache.avro.LogicalType;
@@ -257,7 +258,12 @@ protected Object readRecord(Object old, Schema expected, ResolvingDecoder in) th
257258
*/
258259
protected void readField(Object record, Field field, Object oldDatum, ResolvingDecoder in, Object state)
259260
throws IOException {
260-
data.setField(record, field.name(), field.pos(), read(oldDatum, field.schema(), in), state);
261+
try {
262+
data.setField(record, field.name(), field.pos(), read(oldDatum, field.schema(), in), state);
263+
} catch(AvroTypeException exception) {
264+
String message = "Field \"" + field.name() + "\" content mismatch: " + exception.getMessage();
265+
throw new AvroTypeException(message, exception.getCause());
266+
}
261267
}
262268

263269
/**

lang/java/avro/src/test/java/org/apache/avro/TestSchemaCompatibilityEnumDefaults.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import static org.apache.avro.TestSchemas.ENUM2_AB_SCHEMA;
2323
import static org.apache.avro.TestSchemas.ENUM_ABC_ENUM_DEFAULT_A_SCHEMA;
2424
import static org.apache.avro.TestSchemas.ENUM_AB_ENUM_DEFAULT_A_SCHEMA;
25+
import static org.junit.jupiter.api.Assertions.assertTrue;
2526
import static org.junit.jupiter.api.Assertions.assertEquals;
2627
import static org.junit.jupiter.api.Assertions.assertThrows;
2728

@@ -53,7 +54,7 @@ void enumDefaultNotAppliedWhenWriterFieldMissing() throws Exception {
5354
datum.put("field2", new GenericData.EnumSymbol(writerSchema, "B"));
5455
AvroTypeException avroTypeException = assertThrows(AvroTypeException.class,
5556
() -> serializeWithWriterThenDeserializeWithReader(writerSchema, datum, readerSchema));
56-
assertEquals("Found Record1, expecting Record1, missing required field field1", avroTypeException.getMessage());
57+
assertTrue(avroTypeException.getMessage().contains("Found Record1, expecting Record1, missing required field field1"));
5758
}
5859

5960
@Test
@@ -111,7 +112,7 @@ void fieldDefaultNotAppliedForUnknownSymbol() throws Exception {
111112
datum.put("field1", new GenericData.EnumSymbol(writerSchema, "C"));
112113
AvroTypeException avroTypeException = assertThrows(AvroTypeException.class,
113114
() -> serializeWithWriterThenDeserializeWithReader(writerSchema, datum, readerSchema));
114-
assertEquals("No match for C", avroTypeException.getMessage());
115+
assertEquals("Field \"field1\" content mismatch: No match for C", avroTypeException.getMessage());
115116
}
116117

117118
private GenericRecord serializeWithWriterThenDeserializeWithReader(Schema writerSchema, GenericRecord datum,

lang/java/avro/src/test/java/org/apache/avro/TestUnionError.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,6 @@ void unionErrorMessage() throws IOException {
7979

8080
GenericDatumReader<GenericRecord> datumReader = new GenericDatumReader<>(writerSchema, readerSchema);
8181
AvroTypeException avroException = assertThrows(AvroTypeException.class, () -> datumReader.read(null, decoder));
82-
assertEquals("Found B, expecting union[A, float]", avroException.getMessage());
82+
assertEquals("Field \"c\" content mismatch: Found B, expecting union[A, float]", avroException.getMessage());
8383
}
8484
}

0 commit comments

Comments
 (0)