From 2249a0e0397cb475146787cad634406fa2bce5f8 Mon Sep 17 00:00:00 2001 From: Yaytay Date: Thu, 12 Jun 2025 05:58:59 +0100 Subject: [PATCH 1/5] Added test that demonstrates the problem. --- .../core/converting/ArrayOfSubclassTest.java | 20 ++++++ .../core/converting/ModelConverterTest.java | 7 ++ .../models/ModelWithArrayOfSubclasses.java | 65 +++++++++++++++++++ 3 files changed, 92 insertions(+) create mode 100644 modules/swagger-core/src/test/java/io/swagger/v3/core/converting/ArrayOfSubclassTest.java create mode 100644 modules/swagger-core/src/test/java/io/swagger/v3/core/oas/models/ModelWithArrayOfSubclasses.java diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/ArrayOfSubclassTest.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/ArrayOfSubclassTest.java new file mode 100644 index 0000000000..f978caa7e2 --- /dev/null +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/ArrayOfSubclassTest.java @@ -0,0 +1,20 @@ +package io.swagger.v3.core.converting; + +import io.swagger.v3.core.converter.ModelConverters; +import io.swagger.v3.core.converter.ResolvedSchema; +import io.swagger.v3.core.oas.models.ModelWithArrayOfSubclasses; +import io.swagger.v3.core.util.Json31; +import static org.testng.Assert.assertNotNull; +import org.testng.annotations.Test; + + +public class ArrayOfSubclassTest { + + @Test + public void extractSuclassArray() { + ResolvedSchema schema = ModelConverters.getInstance(true).readAllAsResolvedSchema(ModelWithArrayOfSubclasses.Holder.class); + assertNotNull(schema); + System.out.println(Json31.pretty(schema)); + } + +} diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/ModelConverterTest.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/ModelConverterTest.java index 13a0fa1220..3e02b5aa8d 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/ModelConverterTest.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/ModelConverterTest.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.google.common.collect.ImmutableSet; import io.swagger.v3.core.converter.ModelConverters; +import io.swagger.v3.core.converter.ResolvedSchema; import io.swagger.v3.core.matchers.SerializationMatchers; import io.swagger.v3.core.oas.models.Cat; import io.swagger.v3.core.oas.models.ClientOptInput; @@ -15,6 +16,7 @@ import io.swagger.v3.core.oas.models.ModelPropertyName; import io.swagger.v3.core.oas.models.ModelWithAltPropertyName; import io.swagger.v3.core.oas.models.ModelWithApiModel; +import io.swagger.v3.core.oas.models.ModelWithArrayOfSubclasses; import io.swagger.v3.core.oas.models.ModelWithEnumArray; import io.swagger.v3.core.oas.models.ModelWithFormattedStrings; import io.swagger.v3.core.oas.models.ModelWithNumbers; @@ -269,6 +271,11 @@ public void scanModel() { assertEquals(model.get("Model1155").getProperties().keySet(), ImmutableSet.of("valid", "value", "is", "get", "isA", "getA", "is_persistent", "gettersAndHaters")); } + + @Test + public void extractSuclassArray() { + ResolvedSchema schema = ModelConverters.getInstance().readAllAsResolvedSchema(ModelWithArrayOfSubclasses.class); + } @Test(description = "it should scan a model with numbers") public void scanModelWithNumbers() throws IOException { diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/oas/models/ModelWithArrayOfSubclasses.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/oas/models/ModelWithArrayOfSubclasses.java new file mode 100644 index 0000000000..c6a29e5380 --- /dev/null +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/oas/models/ModelWithArrayOfSubclasses.java @@ -0,0 +1,65 @@ +package io.swagger.v3.core.oas.models; + +import io.swagger.v3.oas.annotations.media.ArraySchema; +import io.swagger.v3.oas.annotations.media.DiscriminatorMapping; +import io.swagger.v3.oas.annotations.media.Schema; + +public class ModelWithArrayOfSubclasses { + + @Schema(description = "The holder") + public class Holder extends SubB { + } + + @Schema( + discriminatorProperty = "name" + , discriminatorMapping = { + @DiscriminatorMapping(schema = SubA.class, value = "a") + , @DiscriminatorMapping(schema = SubB.class, value = "b") + } + , description = "Stuff" + ) + public class Base { + + private String name; + + public String getName() { + return name; + } + } + + @Schema(description = "The SubA class") + public class SubA extends Base { + + private Long count; + + public Long getCount() { + return count; + } + } + + @Schema(description = "The SubB class") + public class SubB extends Base { + + private String friend; + private Base[] baseArray; + + public String getFriend() { + return friend; + } + + @ArraySchema( + schema = @Schema(implementation = Base.class) + , arraySchema = @Schema( + type = "array" + , description = "Thingy" + ) + , minItems = 0 + , uniqueItems = true + ) + public Base[] getBaseArray() { + return baseArray; + } + + } + +} From 3b15421187f472d40dbec71933ce4b4aaee03553 Mon Sep 17 00:00:00 2001 From: Yaytay Date: Thu, 12 Jun 2025 05:58:59 +0100 Subject: [PATCH 2/5] Added test that demonstrates the problem. --- .../core/converting/ArrayOfSubclassTest.java | 20 ++++++ .../core/converting/ModelConverterTest.java | 7 ++ .../models/ModelWithArrayOfSubclasses.java | 65 +++++++++++++++++++ 3 files changed, 92 insertions(+) create mode 100644 modules/swagger-core/src/test/java/io/swagger/v3/core/converting/ArrayOfSubclassTest.java create mode 100644 modules/swagger-core/src/test/java/io/swagger/v3/core/oas/models/ModelWithArrayOfSubclasses.java diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/ArrayOfSubclassTest.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/ArrayOfSubclassTest.java new file mode 100644 index 0000000000..f978caa7e2 --- /dev/null +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/ArrayOfSubclassTest.java @@ -0,0 +1,20 @@ +package io.swagger.v3.core.converting; + +import io.swagger.v3.core.converter.ModelConverters; +import io.swagger.v3.core.converter.ResolvedSchema; +import io.swagger.v3.core.oas.models.ModelWithArrayOfSubclasses; +import io.swagger.v3.core.util.Json31; +import static org.testng.Assert.assertNotNull; +import org.testng.annotations.Test; + + +public class ArrayOfSubclassTest { + + @Test + public void extractSuclassArray() { + ResolvedSchema schema = ModelConverters.getInstance(true).readAllAsResolvedSchema(ModelWithArrayOfSubclasses.Holder.class); + assertNotNull(schema); + System.out.println(Json31.pretty(schema)); + } + +} diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/ModelConverterTest.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/ModelConverterTest.java index 13a0fa1220..3e02b5aa8d 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/ModelConverterTest.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/ModelConverterTest.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.google.common.collect.ImmutableSet; import io.swagger.v3.core.converter.ModelConverters; +import io.swagger.v3.core.converter.ResolvedSchema; import io.swagger.v3.core.matchers.SerializationMatchers; import io.swagger.v3.core.oas.models.Cat; import io.swagger.v3.core.oas.models.ClientOptInput; @@ -15,6 +16,7 @@ import io.swagger.v3.core.oas.models.ModelPropertyName; import io.swagger.v3.core.oas.models.ModelWithAltPropertyName; import io.swagger.v3.core.oas.models.ModelWithApiModel; +import io.swagger.v3.core.oas.models.ModelWithArrayOfSubclasses; import io.swagger.v3.core.oas.models.ModelWithEnumArray; import io.swagger.v3.core.oas.models.ModelWithFormattedStrings; import io.swagger.v3.core.oas.models.ModelWithNumbers; @@ -269,6 +271,11 @@ public void scanModel() { assertEquals(model.get("Model1155").getProperties().keySet(), ImmutableSet.of("valid", "value", "is", "get", "isA", "getA", "is_persistent", "gettersAndHaters")); } + + @Test + public void extractSuclassArray() { + ResolvedSchema schema = ModelConverters.getInstance().readAllAsResolvedSchema(ModelWithArrayOfSubclasses.class); + } @Test(description = "it should scan a model with numbers") public void scanModelWithNumbers() throws IOException { diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/oas/models/ModelWithArrayOfSubclasses.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/oas/models/ModelWithArrayOfSubclasses.java new file mode 100644 index 0000000000..c6a29e5380 --- /dev/null +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/oas/models/ModelWithArrayOfSubclasses.java @@ -0,0 +1,65 @@ +package io.swagger.v3.core.oas.models; + +import io.swagger.v3.oas.annotations.media.ArraySchema; +import io.swagger.v3.oas.annotations.media.DiscriminatorMapping; +import io.swagger.v3.oas.annotations.media.Schema; + +public class ModelWithArrayOfSubclasses { + + @Schema(description = "The holder") + public class Holder extends SubB { + } + + @Schema( + discriminatorProperty = "name" + , discriminatorMapping = { + @DiscriminatorMapping(schema = SubA.class, value = "a") + , @DiscriminatorMapping(schema = SubB.class, value = "b") + } + , description = "Stuff" + ) + public class Base { + + private String name; + + public String getName() { + return name; + } + } + + @Schema(description = "The SubA class") + public class SubA extends Base { + + private Long count; + + public Long getCount() { + return count; + } + } + + @Schema(description = "The SubB class") + public class SubB extends Base { + + private String friend; + private Base[] baseArray; + + public String getFriend() { + return friend; + } + + @ArraySchema( + schema = @Schema(implementation = Base.class) + , arraySchema = @Schema( + type = "array" + , description = "Thingy" + ) + , minItems = 0 + , uniqueItems = true + ) + public Base[] getBaseArray() { + return baseArray; + } + + } + +} From fa0c25973db01300d2404d482fc51affa339706d Mon Sep 17 00:00:00 2001 From: Yaytay Date: Fri, 24 Oct 2025 09:01:31 +0100 Subject: [PATCH 3/5] Do not pass "true" to getArraySchema to avoid StackOverflow on recursive models --- .../src/main/java/io/swagger/v3/core/jackson/ModelResolver.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/ModelResolver.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/ModelResolver.java index 7c00931b23..edbe5f67b9 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/ModelResolver.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/ModelResolver.java @@ -828,7 +828,7 @@ public Schema resolve(AnnotatedType annotatedType, ModelConverterContext context if (reResolvedProperty.isPresent()) { property = reResolvedProperty.get(); } - reResolvedProperty = AnnotationsUtils.getArraySchema(ctxArraySchema, annotatedType.getComponents(), null, openapi31, property, true); + reResolvedProperty = AnnotationsUtils.getArraySchema(ctxArraySchema, annotatedType.getComponents(), null, openapi31, property); if (reResolvedProperty.isPresent()) { property = reResolvedProperty.get(); } From ee56b7155bf2d023ba5ead4492a87d3c6d9ab2a7 Mon Sep 17 00:00:00 2001 From: Yaytay Date: Fri, 31 Oct 2025 15:05:55 +0000 Subject: [PATCH 4/5] #4852 Attempt to fix by tracking in-progress resolves --- .../io/swagger/v3/core/jackson/ModelResolver.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/ModelResolver.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/ModelResolver.java index edbe5f67b9..1e5ae9e491 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/ModelResolver.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/ModelResolver.java @@ -141,6 +141,8 @@ public class ModelResolver extends AbstractModelConverter implements ModelConver protected ValidatorProcessor validatorProcessor; + protected Set typesBeingResolved = new HashSet<>(); + public ModelResolver(ObjectMapper mapper) { super(mapper); } @@ -828,7 +830,17 @@ public Schema resolve(AnnotatedType annotatedType, ModelConverterContext context if (reResolvedProperty.isPresent()) { property = reResolvedProperty.get(); } - reResolvedProperty = AnnotationsUtils.getArraySchema(ctxArraySchema, annotatedType.getComponents(), null, openapi31, property); + + boolean processSchemaImplementation = true; + if (typesBeingResolved.contains(annotatedType)) { + processSchemaImplementation = false; + } else { + typesBeingResolved.add(annotatedType); + } + reResolvedProperty = AnnotationsUtils.getArraySchema(ctxArraySchema, annotatedType.getComponents(), null, openapi31, property, processSchemaImplementation); + if (processSchemaImplementation) { + typesBeingResolved.remove(annotatedType); + } if (reResolvedProperty.isPresent()) { property = reResolvedProperty.get(); } From fb675b1d4678ce2fa4c5bfe82219245e62572ae3 Mon Sep 17 00:00:00 2001 From: Ewa Ostrowska Date: Fri, 7 Nov 2025 14:27:03 +0100 Subject: [PATCH 5/5] fix: StackOverflowError with recursive data model #4852 --- .../v3/core/jackson/ModelResolver.java | 35 ++++-- .../core/converting/ArrayOfSubclassTest.java | 29 ++++- .../ArrayOfSubclassTest_expected30.json | 82 ++++++++++++++ .../ArrayOfSubclassTest_expected31.json | 106 ++++++++++++++++++ .../core/converting/ModelConverterTest.java | 7 -- .../models/ModelWithArrayOfSubclasses.java | 2 - 6 files changed, 237 insertions(+), 24 deletions(-) create mode 100644 modules/swagger-core/src/test/java/io/swagger/v3/core/converting/ArrayOfSubclassTest_expected30.json create mode 100644 modules/swagger-core/src/test/java/io/swagger/v3/core/converting/ArrayOfSubclassTest_expected31.json diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/ModelResolver.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/ModelResolver.java index 1e5ae9e491..baf6eb1539 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/ModelResolver.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/ModelResolver.java @@ -142,7 +142,7 @@ public class ModelResolver extends AbstractModelConverter implements ModelConver protected ValidatorProcessor validatorProcessor; protected Set typesBeingResolved = new HashSet<>(); - + public ModelResolver(ObjectMapper mapper) { super(mapper); } @@ -830,17 +830,8 @@ public Schema resolve(AnnotatedType annotatedType, ModelConverterContext context if (reResolvedProperty.isPresent()) { property = reResolvedProperty.get(); } - - boolean processSchemaImplementation = true; - if (typesBeingResolved.contains(annotatedType)) { - processSchemaImplementation = false; - } else { - typesBeingResolved.add(annotatedType); - } - reResolvedProperty = AnnotationsUtils.getArraySchema(ctxArraySchema, annotatedType.getComponents(), null, openapi31, property, processSchemaImplementation); - if (processSchemaImplementation) { - typesBeingResolved.remove(annotatedType); - } + + reResolvedProperty = resolveArraySchemaWithCycleGuard(ctxArraySchema, annotatedType, openapi31, property); if (reResolvedProperty.isPresent()) { property = reResolvedProperty.get(); } @@ -3616,4 +3607,24 @@ protected boolean applySchemaResolution() { (Boolean.parseBoolean(System.getProperty(Schema.APPLY_SCHEMA_RESOLUTION_PROPERTY, "false")) || Boolean.parseBoolean(System.getenv(Schema.APPLY_SCHEMA_RESOLUTION_PROPERTY))); } + + private Optional resolveArraySchemaWithCycleGuard( + io.swagger.v3.oas.annotations.media.ArraySchema ctxArraySchema, + AnnotatedType annotatedType, + boolean openapi31, + Schema property) { + boolean processSchemaImplementation = !typesBeingResolved.contains(annotatedType); + Optional reResolvedProperty; + if (processSchemaImplementation) { + typesBeingResolved.add(annotatedType); + } try { + reResolvedProperty = AnnotationsUtils.getArraySchema(ctxArraySchema, annotatedType.getComponents(), null, + openapi31, property, processSchemaImplementation ); + } finally { + if (processSchemaImplementation) { + typesBeingResolved.remove(annotatedType); + } + } + return reResolvedProperty; + } } diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/ArrayOfSubclassTest.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/ArrayOfSubclassTest.java index f978caa7e2..e378f4ef5c 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/ArrayOfSubclassTest.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/ArrayOfSubclassTest.java @@ -4,17 +4,40 @@ import io.swagger.v3.core.converter.ResolvedSchema; import io.swagger.v3.core.oas.models.ModelWithArrayOfSubclasses; import io.swagger.v3.core.util.Json31; + +import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; import org.testng.annotations.Test; +import java.nio.file.Files; +import java.nio.file.Paths; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.JsonNode; + public class ArrayOfSubclassTest { @Test - public void extractSuclassArray() { + public void extractSubclassArray_oas31() throws Exception { ResolvedSchema schema = ModelConverters.getInstance(true).readAllAsResolvedSchema(ModelWithArrayOfSubclasses.Holder.class); assertNotNull(schema); - System.out.println(Json31.pretty(schema)); + String expectedJson = new String(Files.readAllBytes(Paths.get("src/test/java/io/swagger/v3/core/converting/ArrayOfSubclassTest_expected31.json"))); + String actualJson = Json31.pretty(schema); + ObjectMapper mapper = new ObjectMapper(); + JsonNode expectedNode = mapper.readTree(expectedJson); + JsonNode actualNode = mapper.readTree(actualJson); + assertEquals(actualNode, expectedNode); } -} + @Test + public void extractSubclassArray_oas30() throws Exception { + ResolvedSchema schema = ModelConverters.getInstance(false).readAllAsResolvedSchema(ModelWithArrayOfSubclasses.Holder.class); + assertNotNull(schema); + String expectedJson = new String(Files.readAllBytes(Paths.get("src/test/java/io/swagger/v3/core/converting/ArrayOfSubclassTest_expected30.json"))); + String actualJson = Json31.pretty(schema); + ObjectMapper mapper = new ObjectMapper(); + JsonNode expectedNode = mapper.readTree(expectedJson); + JsonNode actualNode = mapper.readTree(actualJson); + assertEquals(actualNode, expectedNode); + } +} \ No newline at end of file diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/ArrayOfSubclassTest_expected30.json b/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/ArrayOfSubclassTest_expected30.json new file mode 100644 index 0000000000..bebc8c4ae5 --- /dev/null +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/ArrayOfSubclassTest_expected30.json @@ -0,0 +1,82 @@ +{ + "schema" : { + "description" : "The holder", + "properties" : { + "name" : { + "type" : "string" + }, + "friend" : { + "type" : "string" + }, + "baseArray" : { + "type" : "array", + "description" : "Thingy", + "items" : { + "$ref" : "#/components/schemas/Base" + }, + "minItems" : 0, + "uniqueItems" : true + } + } + }, + "referencedSchemas" : { + "Base" : { + "description" : "Stuff", + "discriminator" : { + "propertyName" : "name", + "mapping" : { + "a" : "#/components/schemas/SubA", + "b" : "#/components/schemas/SubB" + } + }, + "properties" : { + "name" : { + "type" : "string" + } + } + }, + "Holder" : { + "description" : "The holder", + "properties" : { + "name" : { + "type" : "string" + }, + "friend" : { + "type" : "string" + }, + "baseArray" : { + "type" : "array", + "description" : "Thingy", + "items" : { + "$ref" : "#/components/schemas/Base" + }, + "minItems" : 0, + "uniqueItems" : true + } + } + }, + "SubA" : { + "description" : "The SubA class", + "properties" : { + "name" : { + "type" : "string" + }, + "count" : { + "type" : "integer", + "format" : "int64" + } + } + }, + "SubB" : { + "description" : "The SubB class", + "properties" : { + "name" : { + "type" : "string" + }, + "friend" : { + "type" : "string" + } + } + } + } +} \ No newline at end of file diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/ArrayOfSubclassTest_expected31.json b/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/ArrayOfSubclassTest_expected31.json new file mode 100644 index 0000000000..c0b75d0544 --- /dev/null +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/ArrayOfSubclassTest_expected31.json @@ -0,0 +1,106 @@ +{ + "schema" : { + "type" : "object", + "description" : "The holder", + "properties" : { + "name" : { + "type" : "string" + }, + "friend" : { + "type" : "string" + }, + "baseArray" : { + "type" : "array", + "description" : "Thingy", + "items" : { + "$ref" : "#/components/schemas/Base", + "description" : "Thingy", + "minItems" : 0, + "uniqueItems" : true + }, + "minItems" : 0, + "uniqueItems" : true + } + } + }, + "referencedSchemas" : { + "Base" : { + "type" : "object", + "description" : "Stuff", + "discriminator" : { + "propertyName" : "name", + "mapping" : { + "a" : "#/components/schemas/SubA", + "b" : "#/components/schemas/SubB" + } + }, + "properties" : { + "name" : { + "type" : "string" + } + } + }, + "Holder" : { + "type" : "object", + "description" : "The holder", + "properties" : { + "name" : { + "type" : "string" + }, + "friend" : { + "type" : "string" + }, + "baseArray" : { + "type" : "array", + "description" : "Thingy", + "items" : { + "$ref" : "#/components/schemas/Base", + "description" : "Thingy", + "minItems" : 0, + "uniqueItems" : true + }, + "minItems" : 0, + "uniqueItems" : true + } + } + }, + "SubA" : { + "type" : "object", + "description" : "The SubA class", + "properties" : { + "name" : { + "type" : "string" + }, + "count" : { + "type" : "integer", + "format" : "int64" + } + } + }, + "SubB" : { + "type" : "object", + "description" : "The SubB class", + "properties" : { + "name" : { + "type" : "string" + }, + "friend" : { + "type" : "string" + }, + "baseArray" : { + "type" : "array", + "description" : "Thingy", + "items" : { + "$ref" : "#/components/schemas/Base", + "description" : "Thingy", + "minItems" : 0, + "uniqueItems" : true + }, + "minItems" : 0, + "uniqueItems" : true + } + } + } + } +} + diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/ModelConverterTest.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/ModelConverterTest.java index 3e02b5aa8d..13a0fa1220 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/ModelConverterTest.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/ModelConverterTest.java @@ -4,7 +4,6 @@ import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.google.common.collect.ImmutableSet; import io.swagger.v3.core.converter.ModelConverters; -import io.swagger.v3.core.converter.ResolvedSchema; import io.swagger.v3.core.matchers.SerializationMatchers; import io.swagger.v3.core.oas.models.Cat; import io.swagger.v3.core.oas.models.ClientOptInput; @@ -16,7 +15,6 @@ import io.swagger.v3.core.oas.models.ModelPropertyName; import io.swagger.v3.core.oas.models.ModelWithAltPropertyName; import io.swagger.v3.core.oas.models.ModelWithApiModel; -import io.swagger.v3.core.oas.models.ModelWithArrayOfSubclasses; import io.swagger.v3.core.oas.models.ModelWithEnumArray; import io.swagger.v3.core.oas.models.ModelWithFormattedStrings; import io.swagger.v3.core.oas.models.ModelWithNumbers; @@ -271,11 +269,6 @@ public void scanModel() { assertEquals(model.get("Model1155").getProperties().keySet(), ImmutableSet.of("valid", "value", "is", "get", "isA", "getA", "is_persistent", "gettersAndHaters")); } - - @Test - public void extractSuclassArray() { - ResolvedSchema schema = ModelConverters.getInstance().readAllAsResolvedSchema(ModelWithArrayOfSubclasses.class); - } @Test(description = "it should scan a model with numbers") public void scanModelWithNumbers() throws IOException { diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/oas/models/ModelWithArrayOfSubclasses.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/oas/models/ModelWithArrayOfSubclasses.java index c6a29e5380..ab38c42260 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/oas/models/ModelWithArrayOfSubclasses.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/oas/models/ModelWithArrayOfSubclasses.java @@ -59,7 +59,5 @@ public String getFriend() { public Base[] getBaseArray() { return baseArray; } - } - }