From d30cc0ad2ad3140d2b75bde2daa8739fc2b43e71 Mon Sep 17 00:00:00 2001 From: Ken Dallmeyer Date: Thu, 13 Jul 2017 22:33:44 -0500 Subject: [PATCH] Handle non-required fields properly by not adding it to 'required' element --- .../fge/avro/translators/RecordTranslator.java | 17 ++++++++++++++++- src/test/resources/avro/record.json | 2 +- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/github/fge/avro/translators/RecordTranslator.java b/src/main/java/com/github/fge/avro/translators/RecordTranslator.java index 28f470c..7fb8ae2 100644 --- a/src/main/java/com/github/fge/avro/translators/RecordTranslator.java +++ b/src/main/java/com/github/fge/avro/translators/RecordTranslator.java @@ -31,6 +31,7 @@ import org.codehaus.jackson.map.ObjectMapper; import java.io.IOException; +import java.util.Collections; import java.util.List; final class RecordTranslator @@ -96,7 +97,9 @@ protected void doTranslate(final Schema avroSchema, fieldSchema = field.schema(); fieldType = fieldSchema.getType(); translator = AvroTranslators.getTranslator(fieldType); - required.add(fieldName); + if(isRequiredField(fieldSchema)) { + required.add(fieldName); + } ptr = JsonPointer.of("properties", fieldName); propertyNode = FACTORY.objectNode(); properties.put(fieldName, propertyNode); @@ -107,6 +110,18 @@ protected void doTranslate(final Schema avroSchema, } } + private boolean isRequiredField(Schema fieldSchema) { + if(fieldSchema.getType() != Schema.Type.UNION) { + return true; + } + for(Schema typeSchema: fieldSchema.getTypes()) { + if(Schema.Type.NULL == typeSchema.getType()) { + return false; + } + } + return true; + } + private static void injectDefault(final ObjectNode propertyNode, final Schema.Field field) { diff --git a/src/test/resources/avro/record.json b/src/test/resources/avro/record.json index 591cf2f..7ab0abe 100644 --- a/src/test/resources/avro/record.json +++ b/src/test/resources/avro/record.json @@ -21,7 +21,7 @@ "record:LongList": { "type": "object", "additionalProperties": false, - "required": [ "value", "next" ], + "required": [ "value" ], "properties": { "value": { "type": "integer",