diff --git a/avro/src/main/java/com/fasterxml/jackson/dataformat/avro/ser/AvroWriteContext.java b/avro/src/main/java/com/fasterxml/jackson/dataformat/avro/ser/AvroWriteContext.java index e557058e5..51ce1414c 100644 --- a/avro/src/main/java/com/fasterxml/jackson/dataformat/avro/ser/AvroWriteContext.java +++ b/avro/src/main/java/com/fasterxml/jackson/dataformat/avro/ser/AvroWriteContext.java @@ -163,6 +163,28 @@ public final String toString() // // // Shared helper methods + protected GenericRecord _createRecord(Schema schema, Object currValue) throws JsonMappingException + { + Type type = schema.getType(); + if (type == Schema.Type.UNION) { + try { + schema = resolveUnionSchema(schema, currValue); + } catch (UnresolvedUnionException e) { + // couldn't find an exact match + schema = _recordOrMapFromUnion(schema); + } + } + if (type == Schema.Type.MAP) { + throw new IllegalStateException("_createRecord should never be called for elements of type MAP"); + } + try { + return new GenericData.Record(schema); + } catch (RuntimeException e) { + // alas, generator not passed to us + throw new JsonMappingException(null, "Failed to create Record type from "+type, e); + } + } + protected GenericRecord _createRecord(Schema schema) throws JsonMappingException { // Quick check: if type is Union, need to find actual record type... diff --git a/avro/src/main/java/com/fasterxml/jackson/dataformat/avro/ser/RootContext.java b/avro/src/main/java/com/fasterxml/jackson/dataformat/avro/ser/RootContext.java index 392b5e8b3..4c0f9dcc1 100644 --- a/avro/src/main/java/com/fasterxml/jackson/dataformat/avro/ser/RootContext.java +++ b/avro/src/main/java/com/fasterxml/jackson/dataformat/avro/ser/RootContext.java @@ -62,7 +62,7 @@ public final AvroWriteContext createChildObjectContext(Object currValue) throws case RECORD: case UNION: // maybe { - GenericRecord rec = _createRecord(_schema); + GenericRecord rec = _createRecord(_schema, currValue); _rootValue = rec; return new ObjectWriteContext(this, _generator, rec, currValue); } diff --git a/avro/src/test/java/com/fasterxml/jackson/dataformat/avro/interop/annotations/UnionTest.java b/avro/src/test/java/com/fasterxml/jackson/dataformat/avro/interop/annotations/UnionTest.java index adb3dfebe..3864b214c 100644 --- a/avro/src/test/java/com/fasterxml/jackson/dataformat/avro/interop/annotations/UnionTest.java +++ b/avro/src/test/java/com/fasterxml/jackson/dataformat/avro/interop/annotations/UnionTest.java @@ -109,6 +109,15 @@ public boolean equals(Object o) { } } + @Test + public void testRootUnionWithAnimal() throws IOException { + Cat cat = new Cat("meow"); + // + Cat result = roundTrip(Animal.class, cat); + // + assertThat(result).isEqualTo(cat); + } + @Test public void testInterfaceUnionWithCat() throws IOException { Cage cage = new Cage(new Cat("test"));