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

Matthew Read commented on AVRO-1716:
------------------------------------

I was about to raise this issue myself. I am seeing this same problem using 
1.8.0 also. In my mind, the Builder shouldn't be able to build a record object 
that can't be encoded to Avro.

> Java Schema Generated sources, non nullable, default defined fails on 
> setField(null)
> ------------------------------------------------------------------------------------
>
>                 Key: AVRO-1716
>                 URL: https://issues.apache.org/jira/browse/AVRO-1716
>             Project: Avro
>          Issue Type: Bug
>          Components: java
>    Affects Versions: 1.7.7
>            Reporter: Francois Secherre
>              Labels: starter
>
> I define a schema descriptor like:
> {code}
> {
>     "namespace": "some.namespace",
>     "type": "record",
>     "name": "SomeBean",
>     "fields": [
>         {"name": "someField", "type": "string", "default": ""},
>     ]
> }
> {code}
> Then I generate some java classes, using org.apache.avro:avro-maven-plugin. 
> In the builder methods I will get the following:
> {code}
>     public some.namespace.SomeBean.Builder 
> setSomeField(java.lang.CharSequence value) {
>       validate(fields()[0], value);
>       this.someField = value;
>       fieldSetFlags()[0] = true;
>       return this; 
>     }
> {code}
> The Validate methode is like:
> {code}
>     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");
>             }
>         }
>     }
> {code}
> 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:
> {code}
> 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
> {code}
> I believe that in such case we should protect the field from being set to 
> null, and remain at its default value.



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

Reply via email to