[
https://issues.apache.org/jira/browse/AVRO-1716?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Francois Secherre updated AVRO-1716:
------------------------------------
Description:
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.
was:
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}
> 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
>
> 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)