From ae48251fbb21d552e8f5636c1f78d4e2b0c0979d Mon Sep 17 00:00:00 2001 From: Eduard Gomoliako Date: Wed, 30 Oct 2024 18:46:46 +0100 Subject: [PATCH 1/5] test: Test for polymorphic deduction between an objet and an array of objects --- ...TestPolymorphicDeductionObjectVsArray.java | 212 ++++++++++++++++++ 1 file changed, 212 insertions(+) create mode 100644 src/test/java/com/fasterxml/jackson/databind/jsontype/TestPolymorphicDeductionObjectVsArray.java diff --git a/src/test/java/com/fasterxml/jackson/databind/jsontype/TestPolymorphicDeductionObjectVsArray.java b/src/test/java/com/fasterxml/jackson/databind/jsontype/TestPolymorphicDeductionObjectVsArray.java new file mode 100644 index 0000000000..505752031a --- /dev/null +++ b/src/test/java/com/fasterxml/jackson/databind/jsontype/TestPolymorphicDeductionObjectVsArray.java @@ -0,0 +1,212 @@ +package com.fasterxml.jackson.databind.jsontype; + +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.core.*; +import com.fasterxml.jackson.core.io.IOContext; +import com.fasterxml.jackson.core.json.WriterBasedJsonGenerator; +import com.fasterxml.jackson.core.type.WritableTypeId; +import com.fasterxml.jackson.databind.MapperFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.testutil.DatabindTestUtil; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.io.OutputStream; +import java.io.Writer; +import java.util.*; + +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class TestPolymorphicDeductionObjectVsArray extends DatabindTestUtil { + @JsonTypeInfo(use = JsonTypeInfo.Id.DEDUCTION, defaultImpl = DataArray.class) + @JsonSubTypes({@JsonSubTypes.Type(DataObject.class), @JsonSubTypes.Type(DataArray.class)}) + interface Data { + @JsonIgnore + boolean isObject(); + } + + static class DataItem { + final String id; + + @JsonCreator(mode = JsonCreator.Mode.PROPERTIES) + DataItem(@JsonProperty("id") String id) { + this.id = id; + } + + public String getId() { + return id; + } + } + + static class DataObject extends DataItem implements Data { + + @JsonCreator(mode = JsonCreator.Mode.PROPERTIES) + DataObject(@JsonProperty("id") String id) { + super(id); + } + + @Override + public boolean isObject() { + return true; + } + } + + static class DataArray implements Data, Iterable { + final ArrayList items; + + @JsonCreator(mode = JsonCreator.Mode.DELEGATING) + DataArray(Collection items) { + this.items = new ArrayList<>(items); + } + + @Override + public boolean isObject() { + return false; + } + + @Override + public Iterator iterator() { + return items.iterator(); + } + } + + static class Container { + @JsonProperty("data") + Data data; + } + + private final ObjectMapper MAPPER = new ObjectMapper(new TestJsonFactory()); + + private static final String containerWithObjectData = a2q("{'data':{'id':'#1'}}"); + + private static final String containerWithArrayData = a2q("{'data':[{'id':'#1'}]}"); + + @Test + public void testDeserialization() throws Exception { + Container container = MAPPER.readValue(containerWithObjectData, Container.class); + + assertInstanceOf(DataObject.class, container.data); + assertSame(container.data.getClass(), DataObject.class); + assertTrue(container.data.isObject()); + assertEquals("#1", ((DataItem) container.data).id); + + container = MAPPER.readValue(containerWithArrayData, Container.class); + assertInstanceOf(DataArray.class, container.data); + assertSame(container.data.getClass(), DataArray.class); + assertFalse(container.data.isObject()); + + var arrayDataIterator = ((Iterable) container.data).iterator(); + + assertTrue(arrayDataIterator.hasNext()); + assertEquals("#1", arrayDataIterator.next().id); + } + + @Test + public void testSerialization() throws Exception { + Container container = new Container(); + container.data = new DataObject("#1"); + String json = MAPPER.writeValueAsString(container); + assertEquals(containerWithObjectData, json); + + container = new Container(); + container.data = new DataArray(new ArrayList<>(List.of(new DataItem("#1")))); + json = MAPPER.writeValueAsString(container); + assertEquals(containerWithArrayData, json); + } + + private static class TestJsonFactory extends JsonFactory { + @Override + protected JsonGenerator _createGenerator(Writer out, IOContext ctxt) throws IOException { + FixedJsonGenerator gen = new FixedJsonGenerator(ctxt, _generatorFeatures, _objectCodec, out, _quoteChar); + + if (_maximumNonEscapedChar > 0) { + gen.setHighestNonEscapedChar(_maximumNonEscapedChar); + } + + if (_characterEscapes != null) { + gen.setCharacterEscapes(_characterEscapes); + } + + SerializableString rootSep = _rootValueSeparator; + + if (rootSep != DEFAULT_ROOT_VALUE_SEPARATOR) { + gen.setRootValueSeparator(rootSep); + } + + return _decorate(gen); + } + } + + private static class FixedJsonGenerator extends WriterBasedJsonGenerator { + + public FixedJsonGenerator( + IOContext ctxt, + int features, + ObjectCodec codec, + Writer w, + char quoteChar) { + super(ctxt, features, codec, w, quoteChar); + } + + @Override + public WritableTypeId writeTypePrefix(WritableTypeId typeIdDef) throws IOException { + Object id = typeIdDef.id; + + final JsonToken valueShape = typeIdDef.valueShape; + if (canWriteTypeId()) { + typeIdDef.wrapperWritten = false; + // just rely on native type output method (sub-classes likely to override) + writeTypeId(id); + } else { + // No native type id; write wrappers + // Normally we only support String type ids (non-String reserved for native type ids) + String idStr = (id instanceof String) ? (String) id : Objects.toString(id, null); + typeIdDef.wrapperWritten = true; + + WritableTypeId.Inclusion incl = typeIdDef.include; + // first: can not output "as property" if value not Object; if so, must do "as array" + if ((valueShape != JsonToken.START_OBJECT) + && idStr != null + && incl.requiresObjectContext()) { + typeIdDef.include = incl = WritableTypeId.Inclusion.WRAPPER_ARRAY; + } + + switch (incl) { + case PARENT_PROPERTY: + // nothing to do here, as it has to be written in suffix... + break; + case PAYLOAD_PROPERTY: + // only output as native type id; otherwise caller must handle using some + // other mechanism, so... + break; + case METADATA_PROPERTY: + // must have Object context by now, so simply write as field name + // Note, too, that it's bit tricky, since we must print START_OBJECT that is part + // of value first -- and then NOT output it later on: hence return "early" + writeStartObject(typeIdDef.forValue); + writeStringField(typeIdDef.asProperty, idStr); + return typeIdDef; + + case WRAPPER_OBJECT: + // NOTE: this is wrapper, not directly related to value to output, so don't pass + writeStartObject(); + writeFieldName(idStr); + break; + case WRAPPER_ARRAY: + default: // should never occur but translate as "as-array" + writeStartArray(); // wrapper, not actual array object to write + writeString(idStr); + } + } + // and finally possible start marker for value itself: + if (valueShape == JsonToken.START_OBJECT) { + writeStartObject(typeIdDef.forValue); + } else if (valueShape == JsonToken.START_ARRAY) { + // should we now set the current object? + writeStartArray(); + } + return typeIdDef; + } + } +} From 8ff604855fb99a30eaac63e182026649a6f0488d Mon Sep 17 00:00:00 2001 From: Eduard Gomoliako Date: Wed, 30 Oct 2024 18:49:49 +0100 Subject: [PATCH 2/5] test: Test for polymorphic deduction between an objet and an array of objects --- .../TestPolymorphicDeductionObjectVsArray.java | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/src/test/java/com/fasterxml/jackson/databind/jsontype/TestPolymorphicDeductionObjectVsArray.java b/src/test/java/com/fasterxml/jackson/databind/jsontype/TestPolymorphicDeductionObjectVsArray.java index 505752031a..cf463b10b7 100644 --- a/src/test/java/com/fasterxml/jackson/databind/jsontype/TestPolymorphicDeductionObjectVsArray.java +++ b/src/test/java/com/fasterxml/jackson/databind/jsontype/TestPolymorphicDeductionObjectVsArray.java @@ -5,18 +5,15 @@ import com.fasterxml.jackson.core.io.IOContext; import com.fasterxml.jackson.core.json.WriterBasedJsonGenerator; import com.fasterxml.jackson.core.type.WritableTypeId; -import com.fasterxml.jackson.databind.MapperFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.testutil.DatabindTestUtil; import org.junit.jupiter.api.Test; import java.io.IOException; -import java.io.OutputStream; import java.io.Writer; import java.util.*; import static org.junit.jupiter.api.Assertions.*; -import static org.junit.jupiter.api.Assertions.assertEquals; public class TestPolymorphicDeductionObjectVsArray extends DatabindTestUtil { @JsonTypeInfo(use = JsonTypeInfo.Id.DEDUCTION, defaultImpl = DataArray.class) @@ -52,23 +49,16 @@ public boolean isObject() { } } - static class DataArray implements Data, Iterable { - final ArrayList items; - + static class DataArray extends ArrayList implements Data { @JsonCreator(mode = JsonCreator.Mode.DELEGATING) DataArray(Collection items) { - this.items = new ArrayList<>(items); + super(new ArrayList<>(items)); } @Override public boolean isObject() { return false; } - - @Override - public Iterator iterator() { - return items.iterator(); - } } static class Container { From 3ae3e61272f7b7d65447c34fcc29f6560a23ead5 Mon Sep 17 00:00:00 2001 From: Eduard Gomoliako Date: Wed, 30 Oct 2024 18:56:45 +0100 Subject: [PATCH 3/5] test: Test for polymorphic deduction between an objet and an array of objects --- ...TestPolymorphicDeductionObjectVsArray.java | 109 +----------------- 1 file changed, 5 insertions(+), 104 deletions(-) diff --git a/src/test/java/com/fasterxml/jackson/databind/jsontype/TestPolymorphicDeductionObjectVsArray.java b/src/test/java/com/fasterxml/jackson/databind/jsontype/TestPolymorphicDeductionObjectVsArray.java index cf463b10b7..983c5d0a50 100644 --- a/src/test/java/com/fasterxml/jackson/databind/jsontype/TestPolymorphicDeductionObjectVsArray.java +++ b/src/test/java/com/fasterxml/jackson/databind/jsontype/TestPolymorphicDeductionObjectVsArray.java @@ -1,17 +1,13 @@ package com.fasterxml.jackson.databind.jsontype; import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.core.*; -import com.fasterxml.jackson.core.io.IOContext; -import com.fasterxml.jackson.core.json.WriterBasedJsonGenerator; -import com.fasterxml.jackson.core.type.WritableTypeId; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.testutil.DatabindTestUtil; import org.junit.jupiter.api.Test; -import java.io.IOException; -import java.io.Writer; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; import static org.junit.jupiter.api.Assertions.*; @@ -50,7 +46,7 @@ public boolean isObject() { } static class DataArray extends ArrayList implements Data { - @JsonCreator(mode = JsonCreator.Mode.DELEGATING) + @JsonCreator DataArray(Collection items) { super(new ArrayList<>(items)); } @@ -66,7 +62,7 @@ static class Container { Data data; } - private final ObjectMapper MAPPER = new ObjectMapper(new TestJsonFactory()); + private final ObjectMapper MAPPER = new ObjectMapper(); private static final String containerWithObjectData = a2q("{'data':{'id':'#1'}}"); @@ -104,99 +100,4 @@ public void testSerialization() throws Exception { json = MAPPER.writeValueAsString(container); assertEquals(containerWithArrayData, json); } - - private static class TestJsonFactory extends JsonFactory { - @Override - protected JsonGenerator _createGenerator(Writer out, IOContext ctxt) throws IOException { - FixedJsonGenerator gen = new FixedJsonGenerator(ctxt, _generatorFeatures, _objectCodec, out, _quoteChar); - - if (_maximumNonEscapedChar > 0) { - gen.setHighestNonEscapedChar(_maximumNonEscapedChar); - } - - if (_characterEscapes != null) { - gen.setCharacterEscapes(_characterEscapes); - } - - SerializableString rootSep = _rootValueSeparator; - - if (rootSep != DEFAULT_ROOT_VALUE_SEPARATOR) { - gen.setRootValueSeparator(rootSep); - } - - return _decorate(gen); - } - } - - private static class FixedJsonGenerator extends WriterBasedJsonGenerator { - - public FixedJsonGenerator( - IOContext ctxt, - int features, - ObjectCodec codec, - Writer w, - char quoteChar) { - super(ctxt, features, codec, w, quoteChar); - } - - @Override - public WritableTypeId writeTypePrefix(WritableTypeId typeIdDef) throws IOException { - Object id = typeIdDef.id; - - final JsonToken valueShape = typeIdDef.valueShape; - if (canWriteTypeId()) { - typeIdDef.wrapperWritten = false; - // just rely on native type output method (sub-classes likely to override) - writeTypeId(id); - } else { - // No native type id; write wrappers - // Normally we only support String type ids (non-String reserved for native type ids) - String idStr = (id instanceof String) ? (String) id : Objects.toString(id, null); - typeIdDef.wrapperWritten = true; - - WritableTypeId.Inclusion incl = typeIdDef.include; - // first: can not output "as property" if value not Object; if so, must do "as array" - if ((valueShape != JsonToken.START_OBJECT) - && idStr != null - && incl.requiresObjectContext()) { - typeIdDef.include = incl = WritableTypeId.Inclusion.WRAPPER_ARRAY; - } - - switch (incl) { - case PARENT_PROPERTY: - // nothing to do here, as it has to be written in suffix... - break; - case PAYLOAD_PROPERTY: - // only output as native type id; otherwise caller must handle using some - // other mechanism, so... - break; - case METADATA_PROPERTY: - // must have Object context by now, so simply write as field name - // Note, too, that it's bit tricky, since we must print START_OBJECT that is part - // of value first -- and then NOT output it later on: hence return "early" - writeStartObject(typeIdDef.forValue); - writeStringField(typeIdDef.asProperty, idStr); - return typeIdDef; - - case WRAPPER_OBJECT: - // NOTE: this is wrapper, not directly related to value to output, so don't pass - writeStartObject(); - writeFieldName(idStr); - break; - case WRAPPER_ARRAY: - default: // should never occur but translate as "as-array" - writeStartArray(); // wrapper, not actual array object to write - writeString(idStr); - } - } - // and finally possible start marker for value itself: - if (valueShape == JsonToken.START_OBJECT) { - writeStartObject(typeIdDef.forValue); - } else if (valueShape == JsonToken.START_ARRAY) { - // should we now set the current object? - writeStartArray(); - } - return typeIdDef; - } - } } From 85819b1d9ba49ded43996f8ea8542d6b4c8592a6 Mon Sep 17 00:00:00 2001 From: Tatu Saloranta Date: Sat, 9 Nov 2024 10:38:20 -0800 Subject: [PATCH 4/5] Fix code to work on Java 8 --- ...TestPolymorphicDeductionObjectVsArray.java | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/test/java/com/fasterxml/jackson/databind/jsontype/TestPolymorphicDeductionObjectVsArray.java b/src/test/java/com/fasterxml/jackson/databind/jsontype/TestPolymorphicDeductionObjectVsArray.java index 983c5d0a50..772425085f 100644 --- a/src/test/java/com/fasterxml/jackson/databind/jsontype/TestPolymorphicDeductionObjectVsArray.java +++ b/src/test/java/com/fasterxml/jackson/databind/jsontype/TestPolymorphicDeductionObjectVsArray.java @@ -1,13 +1,15 @@ package com.fasterxml.jackson.databind.jsontype; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Iterator; + +import org.junit.jupiter.api.Test; + import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.testutil.DatabindTestUtil; -import org.junit.jupiter.api.Test; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; import static org.junit.jupiter.api.Assertions.*; @@ -46,6 +48,8 @@ public boolean isObject() { } static class DataArray extends ArrayList implements Data { + private static final long serialVersionUID = 1L; + @JsonCreator DataArray(Collection items) { super(new ArrayList<>(items)); @@ -62,7 +66,7 @@ static class Container { Data data; } - private final ObjectMapper MAPPER = new ObjectMapper(); + private final ObjectMapper MAPPER = newJsonMapper(); private static final String containerWithObjectData = a2q("{'data':{'id':'#1'}}"); @@ -79,10 +83,10 @@ public void testDeserialization() throws Exception { container = MAPPER.readValue(containerWithArrayData, Container.class); assertInstanceOf(DataArray.class, container.data); - assertSame(container.data.getClass(), DataArray.class); + assertEquals(container.data.getClass(), DataArray.class); assertFalse(container.data.isObject()); - var arrayDataIterator = ((Iterable) container.data).iterator(); + Iterator arrayDataIterator = ((Iterable) container.data).iterator(); assertTrue(arrayDataIterator.hasNext()); assertEquals("#1", arrayDataIterator.next().id); @@ -96,7 +100,7 @@ public void testSerialization() throws Exception { assertEquals(containerWithObjectData, json); container = new Container(); - container.data = new DataArray(new ArrayList<>(List.of(new DataItem("#1")))); + container.data = new DataArray(Arrays.asList(new DataItem("#1"))); json = MAPPER.writeValueAsString(container); assertEquals(containerWithArrayData, json); } From 74423d1b6983c1bcdf2e07938bedfece6b5fe54d Mon Sep 17 00:00:00 2001 From: Tatu Saloranta Date: Sat, 9 Nov 2024 10:44:55 -0800 Subject: [PATCH 5/5] Update release notes, warnings removal --- release-notes/CREDITS-2.x | 3 +++ release-notes/VERSION-2.x | 3 +++ ...rray.java => PolymorphicDeductionObjectVsArrayTest.java} | 3 ++- .../databind/jsontype/TestGenericListSerialization.java | 1 - .../jackson/databind/jsontype/TestPolymorphicDeduction.java | 6 +----- .../fasterxml/jackson/databind/jsontype/TestTypeNames.java | 1 - .../jackson/databind/jsontype/TestTypedDeserialization.java | 1 - 7 files changed, 9 insertions(+), 9 deletions(-) rename src/test/java/com/fasterxml/jackson/databind/jsontype/{TestPolymorphicDeductionObjectVsArray.java => PolymorphicDeductionObjectVsArrayTest.java} (96%) diff --git a/release-notes/CREDITS-2.x b/release-notes/CREDITS-2.x index 084f385c8d..2535cd7f82 100644 --- a/release-notes/CREDITS-2.x +++ b/release-notes/CREDITS-2.x @@ -1828,6 +1828,9 @@ Eduard Gomoliako (@Gems) * Reported #4602: Possible wrong use of _arrayDelegateDeserializer in BeanDeserializerBase::deserializeFromObjectUsingNonDefault() (2.18.0) + * Reported #4772: Serialization and deserialization issue of sub-types used with + `JsonTypeInfo.Id.DEDUCTION` where sub-types are Object and Array + (2.19.0) Mathijs Vogelzang (@mathijs81) * Reported #4678: Java records don't serialize with `MapperFeature.REQUIRE_SETTERS_FOR_GETTERS` diff --git a/release-notes/VERSION-2.x b/release-notes/VERSION-2.x index 5377415494..6d6a801880 100644 --- a/release-notes/VERSION-2.x +++ b/release-notes/VERSION-2.x @@ -24,6 +24,9 @@ Project: jackson-databind Map object is ignored when Map key type not defined (reported by @devdanylo) (fix by Joo-Hyuk K) +#4772: Serialization and deserialization issue of sub-types used with + `JsonTypeInfo.Id.DEDUCTION` where sub-types are Object and Array + (reported by Eduard G) #4773: `SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS` should not apply to Maps with uncomparable keys (requested by @nathanukey) diff --git a/src/test/java/com/fasterxml/jackson/databind/jsontype/TestPolymorphicDeductionObjectVsArray.java b/src/test/java/com/fasterxml/jackson/databind/jsontype/PolymorphicDeductionObjectVsArrayTest.java similarity index 96% rename from src/test/java/com/fasterxml/jackson/databind/jsontype/TestPolymorphicDeductionObjectVsArray.java rename to src/test/java/com/fasterxml/jackson/databind/jsontype/PolymorphicDeductionObjectVsArrayTest.java index 772425085f..e39e3e3815 100644 --- a/src/test/java/com/fasterxml/jackson/databind/jsontype/TestPolymorphicDeductionObjectVsArray.java +++ b/src/test/java/com/fasterxml/jackson/databind/jsontype/PolymorphicDeductionObjectVsArrayTest.java @@ -13,7 +13,7 @@ import static org.junit.jupiter.api.Assertions.*; -public class TestPolymorphicDeductionObjectVsArray extends DatabindTestUtil { +public class PolymorphicDeductionObjectVsArrayTest extends DatabindTestUtil { @JsonTypeInfo(use = JsonTypeInfo.Id.DEDUCTION, defaultImpl = DataArray.class) @JsonSubTypes({@JsonSubTypes.Type(DataObject.class), @JsonSubTypes.Type(DataArray.class)}) interface Data { @@ -86,6 +86,7 @@ public void testDeserialization() throws Exception { assertEquals(container.data.getClass(), DataArray.class); assertFalse(container.data.isObject()); + @SuppressWarnings("unchecked") Iterator arrayDataIterator = ((Iterable) container.data).iterator(); assertTrue(arrayDataIterator.hasNext()); diff --git a/src/test/java/com/fasterxml/jackson/databind/jsontype/TestGenericListSerialization.java b/src/test/java/com/fasterxml/jackson/databind/jsontype/TestGenericListSerialization.java index da2d3471cd..3bf189e634 100644 --- a/src/test/java/com/fasterxml/jackson/databind/jsontype/TestGenericListSerialization.java +++ b/src/test/java/com/fasterxml/jackson/databind/jsontype/TestGenericListSerialization.java @@ -10,7 +10,6 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.*; import com.fasterxml.jackson.databind.testutil.DatabindTestUtil; -import com.fasterxml.jackson.databind.type.TypeFactory; import static org.junit.jupiter.api.Assertions.*; diff --git a/src/test/java/com/fasterxml/jackson/databind/jsontype/TestPolymorphicDeduction.java b/src/test/java/com/fasterxml/jackson/databind/jsontype/TestPolymorphicDeduction.java index e731077b8a..62f4bc08c6 100644 --- a/src/test/java/com/fasterxml/jackson/databind/jsontype/TestPolymorphicDeduction.java +++ b/src/test/java/com/fasterxml/jackson/databind/jsontype/TestPolymorphicDeduction.java @@ -9,15 +9,11 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonValue; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.JavaType; -import com.fasterxml.jackson.databind.MapperFeature; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.*; import com.fasterxml.jackson.databind.exc.InvalidDefinitionException; import com.fasterxml.jackson.databind.exc.InvalidTypeIdException; import com.fasterxml.jackson.databind.json.JsonMapper; import com.fasterxml.jackson.databind.testutil.DatabindTestUtil; -import com.fasterxml.jackson.databind.type.TypeFactory; import static org.junit.jupiter.api.Assertions.*; diff --git a/src/test/java/com/fasterxml/jackson/databind/jsontype/TestTypeNames.java b/src/test/java/com/fasterxml/jackson/databind/jsontype/TestTypeNames.java index d03d96feb1..e87c8c1649 100644 --- a/src/test/java/com/fasterxml/jackson/databind/jsontype/TestTypeNames.java +++ b/src/test/java/com/fasterxml/jackson/databind/jsontype/TestTypeNames.java @@ -12,7 +12,6 @@ import com.fasterxml.jackson.databind.*; import com.fasterxml.jackson.databind.jsontype.impl.StdSubtypeResolver; import com.fasterxml.jackson.databind.testutil.DatabindTestUtil; -import com.fasterxml.jackson.databind.type.TypeFactory; import static org.junit.jupiter.api.Assertions.*; diff --git a/src/test/java/com/fasterxml/jackson/databind/jsontype/TestTypedDeserialization.java b/src/test/java/com/fasterxml/jackson/databind/jsontype/TestTypedDeserialization.java index 6ab0a7909f..0a064a9d6b 100644 --- a/src/test/java/com/fasterxml/jackson/databind/jsontype/TestTypedDeserialization.java +++ b/src/test/java/com/fasterxml/jackson/databind/jsontype/TestTypedDeserialization.java @@ -14,7 +14,6 @@ import com.fasterxml.jackson.databind.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.testutil.DatabindTestUtil; -import com.fasterxml.jackson.databind.type.TypeFactory; import static org.junit.jupiter.api.Assertions.*;