Description
I define a schema descriptor like:
{ "namespace": "some.namespace", "type": "record", "name": "SomeBean", "fields": [ {"name": "someField", "type": "string", "default": ""}, ] }
Then I generate some java classes, using org.apache.avro:avro-maven-plugin. In the builder methods I will get the following:
public some.namespace.SomeBean.Builder setSomeField(java.lang.CharSequence value) { validate(fields()[0], value); this.someField = value; fieldSetFlags()[0] = true; return this; }
The Validate methode is like:
protected void validate(Field field, Object value) { if(!isValidValue(field, value)) { if(field.defaultValue() == null) { throw new AvroRuntimeException("Field " + field + " does not accept null values"); } } }
So if I perform SomeBean.setSomeField(null), as the defaultValue is defined, no exception will raise. However, someField will get a null value. That lead to the following type of error:
java.lang.NullPointerException: null of string in field someField of some.namespace.SomeBean at org.apache.avro.generic.GenericDatumWriter.npe(GenericDatumWriter.java:93) at org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:87) at org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:58) ... Caused by: java.lang.NullPointerException at org.apache.avro.io.Encoder.writeString(Encoder.java:121) at org.apache.avro.generic.GenericDatumWriter.writeString(GenericDatumWriter.java:213) at org.apache.avro.generic.GenericDatumWriter.writeString(GenericDatumWriter.java:208) at org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:76) at org.apache.avro.generic.GenericDatumWriter.writeField(GenericDatumWriter.java:114) at org.apache.avro.generic.GenericDatumWriter.writeRecord(GenericDatumWriter.java:104) at org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:66) ... 7 more
I believe that in such case we should protect the field from being set to null, and remain at its default value.
Attachments
Issue Links
- is superceded by
-
AVRO-2478 RecordBuilderBase.validate doesn't check nullability of composite types
- Open