diff --git a/src/main/java/org/eclipse/yasson/internal/deserializer/InheritanceInstanceCreator.java b/src/main/java/org/eclipse/yasson/internal/deserializer/InheritanceInstanceCreator.java index 4360f57e6..efcc6c54e 100644 --- a/src/main/java/org/eclipse/yasson/internal/deserializer/InheritanceInstanceCreator.java +++ b/src/main/java/org/eclipse/yasson/internal/deserializer/InheritanceInstanceCreator.java @@ -87,7 +87,7 @@ private Class getPolymorphicTypeClass(String alias) { return entry.getKey(); } } - throw new JsonbException("Unknown alias \"" + alias + "\" known aliases: " + throw new JsonbException("Unknown alias \"" + alias + "\" of the type " + processedType.getName() + ". Known aliases: " + typeInheritanceConfiguration.getAliases().values()); } diff --git a/src/main/java/org/eclipse/yasson/internal/model/ClassModel.java b/src/main/java/org/eclipse/yasson/internal/model/ClassModel.java index 7355360f3..0ec3a8a20 100644 --- a/src/main/java/org/eclipse/yasson/internal/model/ClassModel.java +++ b/src/main/java/org/eclipse/yasson/internal/model/ClassModel.java @@ -195,4 +195,11 @@ public Constructor getDefaultConstructor() { } return defaultConstructor; } + + @Override + public String toString() { + return "ClassModel{" + + "clazz=" + clazz + + '}'; + } } diff --git a/src/main/java/org/eclipse/yasson/internal/serializer/SerializationModelCreator.java b/src/main/java/org/eclipse/yasson/internal/serializer/SerializationModelCreator.java index c3de98f76..de8942e1f 100644 --- a/src/main/java/org/eclipse/yasson/internal/serializer/SerializationModelCreator.java +++ b/src/main/java/org/eclipse/yasson/internal/serializer/SerializationModelCreator.java @@ -233,10 +233,10 @@ private void addPolymorphismProperty(TypeInheritanceConfiguration typeInheritanc Class rawType = classModel.getType(); String alias = typeInheritanceConfiguration.getAliases().get(rawType); ModelSerializer serializer = createPolymorphismPropertySerializer(typeInheritanceConfiguration, alias); + if ((!typeInheritanceConfiguration.isInherited() || alias != null) && typeInheritanceConfiguration.getParentConfig() != null) { + addParentPolymorphismProperty(typeInheritanceConfiguration.getParentConfig(), propertySerializers, classModel); + } if (serializer != null) { - if (typeInheritanceConfiguration.getParentConfig() != null) { - addParentPolymorphismProperty(typeInheritanceConfiguration.getParentConfig(), propertySerializers, classModel); - } propertySerializers.put(typeInheritanceConfiguration.getFieldName(), serializer); } for (PropertyModel propertyModel : classModel.getSortedProperties()) { @@ -273,10 +273,9 @@ private void addParentPolymorphismProperty(TypeInheritanceConfiguration typeInhe } } - private ModelSerializer createPolymorphismPropertySerializer(TypeInheritanceConfiguration typeConfiguration, - String alias) { + private ModelSerializer createPolymorphismPropertySerializer(TypeInheritanceConfiguration configuration, String alias) { if (alias != null) { - return (value, generator, context) -> generator.write(typeConfiguration.getFieldName(), alias); + return (value, generator, context) -> generator.write(configuration.getFieldName(), alias); } return null; } diff --git a/src/test/java/org/eclipse/yasson/customization/polymorphism/AnnotationPolymorphismTest.java b/src/test/java/org/eclipse/yasson/customization/polymorphism/AnnotationPolymorphismTest.java index db13e409e..bf6ae1b73 100644 --- a/src/test/java/org/eclipse/yasson/customization/polymorphism/AnnotationPolymorphismTest.java +++ b/src/test/java/org/eclipse/yasson/customization/polymorphism/AnnotationPolymorphismTest.java @@ -69,7 +69,8 @@ public void testUnknownAliasDeserialization() { JsonbException exception = assertThrows(JsonbException.class, () -> Jsonbs.defaultJsonb.fromJson("{\"@type\":\"rat\",\"isDog\":false}", Animal.class)); - assertThat(exception.getMessage(), startsWith("Unknown alias \"rat\" known aliases: [")); + assertThat(exception.getMessage(), startsWith("Unknown alias \"rat\" of the type org.eclipse.yasson.customization." + + "polymorphism.AnnotationPolymorphismTest$Animal. Known aliases: [")); } @Test diff --git a/src/test/java/org/eclipse/yasson/customization/polymorphism/MultiplePolymorphicInfoTest.java b/src/test/java/org/eclipse/yasson/customization/polymorphism/MultiplePolymorphicInfoTest.java index 0b8f53c0d..9bb575a8c 100644 --- a/src/test/java/org/eclipse/yasson/customization/polymorphism/MultiplePolymorphicInfoTest.java +++ b/src/test/java/org/eclipse/yasson/customization/polymorphism/MultiplePolymorphicInfoTest.java @@ -43,6 +43,21 @@ public void testMultiplePolymorphicInfoPropertyDeserialization() { assertThat(JSONB.fromJson(json, Labrador.class), instanceOf(Labrador.class)); } + @Test + public void testPolymorphicParentInstanceSerialization() { + String expected = "{\"@type\":\"area\",\"name\":\"North America\",\"population\":600000000}"; + Area northAmerica = new Area(); + northAmerica.name = "North America"; + northAmerica.population = 600000000; + assertThat(JSONB.toJson(northAmerica), is(expected)); + } + + @Test + public void testPolymorphicParentInstanceDeserialization() { + String json = "{\"@type\":\"area\",\"name\":\"North America\",\"population\":600000000}"; + assertThat(JSONB.fromJson(json, Location.class), instanceOf(Area.class)); + } + @JsonbTypeInfo(key = "@something", value = { @JsonbSubtype(alias = "animal", type = Animal.class) }) @@ -65,4 +80,28 @@ public static class Labrador implements Dog { public boolean isLabrador = true; } + + @JsonbTypeInfo({ + @JsonbSubtype(alias = "area", type = Area.class) + }) + public interface Location { + } + + @JsonbTypeInfo(key = "@area", value = { + @JsonbSubtype(alias = "city", type = City.class), + @JsonbSubtype(alias = "state", type = State.class) + }) + public static class Area implements Location { + public String name; + public long population; + } + + public static class City extends Area { + public String state; + } + + public static class State extends Area { + public String capital; + } + }