[ https://issues.apache.org/jira/browse/NIFI-4030?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Mark Payne updated NIFI-4030: ----------------------------- Resolution: Fixed Status: Resolved (was: Patch Available) > Avro Schema with default values can cause NPE > --------------------------------------------- > > Key: NIFI-4030 > URL: https://issues.apache.org/jira/browse/NIFI-4030 > Project: Apache NiFi > Issue Type: Bug > Affects Versions: 1.2.0, 1.3.0 > Reporter: Bryan Bende > Assignee: Bryan Bende > Priority: Minor > Fix For: 1.4.0 > > Attachments: Convert_Avro_Short_to_Full.xml > > > While coming up with an example to convert between Avro schemas, I ran into > the following scenario... > I created two schemas like the following: > {code} > { > "name": "shortSchema", > "namespace": "nifi", > "type": "record", > "fields": [ > { "name": "a", "type": "string" }, > { "name": "b", "type": "string" } > ] > } > {code} > {code} > { > "name": "fullSchema", > "namespace": "nifi", > "type": "record", > "fields": [ > { "name": "c", "type": "string", "default" : "default value for field c" > }, > { "name": "d", "type": "string", "default" : "default value for field d" > }, > { "name": "a", "type": "string" }, > { "name": "b", "type": "string" } > ] > } > {code} > Then I created a flow with a ConvertRecord processor that read a flow file > which had Avro created with the shortSchema, and used a writer configured to > write with the fullSchema. > This produced the following exception, even though the fullSchema has default > values for additional fields: > {code} > ERROR [Timer-Driven Process Thread-1] o.a.n.processors.standard.ConvertRecord > ConvertRecord[id=ec373b3a-5704-1c6b-f501-0977a332d513] Failed to process > StandardFlowFileRecord[uuid=a8e604a9-1e15-4b9b-a4b7-fdbd441d3f2a,claim=StandardContentClaim > [resourceClaim=StandardResourceClaim[id=1496842800576-10, container=default, > section=10], offset=40141, > length=196],offset=0,name=128518448076937,size=196]: > org.apache.avro.file.DataFileWriter$AppendWriteException: > java.lang.NullPointerException: null of string in field c of nifi.fullSchema > org.apache.avro.file.DataFileWriter$AppendWriteException: > java.lang.NullPointerException: null of string in field c of nifi.fullSchema > at org.apache.avro.file.DataFileWriter.append(DataFileWriter.java:308) > at > org.apache.nifi.avro.WriteAvroResultWithSchema.writeRecord(WriteAvroResultWithSchema.java:59) > at > org.apache.nifi.serialization.AbstractRecordSetWriter.write(AbstractRecordSetWriter.java:59) > at > org.apache.nifi.processors.standard.AbstractRecordProcessor$1.process(AbstractRecordProcessor.java:130) > at > org.apache.nifi.controller.repository.StandardProcessSession.write(StandardProcessSession.java:2785) > at > org.apache.nifi.processors.standard.AbstractRecordProcessor.onTrigger(AbstractRecordProcessor.java:118) > at > org.apache.nifi.processor.AbstractProcessor.onTrigger(AbstractProcessor.java:27) > at > org.apache.nifi.controller.StandardProcessorNode.onTrigger(StandardProcessorNode.java:1120) > at > org.apache.nifi.controller.tasks.ContinuallyRunProcessorTask.call(ContinuallyRunProcessorTask.java:147) > at > org.apache.nifi.controller.tasks.ContinuallyRunProcessorTask.call(ContinuallyRunProcessorTask.java:47) > at > org.apache.nifi.controller.scheduling.TimerDrivenSchedulingAgent$1.run(TimerDrivenSchedulingAgent.java:132) > at > java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) > at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) > at > java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) > at > java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) > at > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) > at java.lang.Thread.run(Thread.java:745) > Caused by: java.lang.NullPointerException: null of string in field c of > nifi.fullSchema > at > org.apache.avro.generic.GenericDatumWriter.npe(GenericDatumWriter.java:132) > at > org.apache.avro.generic.GenericDatumWriter.writeWithoutConversion(GenericDatumWriter.java:126) > at > org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:73) > at > org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:60) > at org.apache.avro.file.DataFileWriter.append(DataFileWriter.java:302) > ... 17 common frames omitted > Caused by: java.lang.NullPointerException: null > {code} > I worked around this by changing the type of the new fields from "string" to > ["null", "string"] and then Avro seems to fill in the default value. > We should be able to work around this and give the default value to Avro > before it gets to the point of a NPE. > Template attached. -- This message was sent by Atlassian JIRA (v6.3.15#6346)