From f4884c491ecb0720c19658525713e1cbdb76ade2 Mon Sep 17 00:00:00 2001 From: K5qu4r3d Date: Wed, 24 Sep 2025 13:33:54 -0400 Subject: [PATCH 01/31] fix: verify Schema object getTypes() is not null or empty --- .../main/java/io/swagger/v3/core/util/AnnotationsUtils.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/AnnotationsUtils.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/AnnotationsUtils.java index e331732722..6177f75078 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/AnnotationsUtils.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/AnnotationsUtils.java @@ -951,7 +951,10 @@ public static Schema resolveSchemaFromType(Class schemaImplementation, Compon existingSchemaObject = reResolvedSchema.get(); } } - if (StringUtils.isBlank(existingSchemaObject.get$ref()) && StringUtils.isBlank(existingSchemaObject.getType())) { + boolean doesSchemaHaveTypes = existingSchemaObject.getTypes() == null || existingSchemaObject.getTypes().isEmpty(); + if (StringUtils.isBlank(existingSchemaObject.get$ref()) + && StringUtils.isBlank(existingSchemaObject.getType()) + && doesSchemaHaveTypes) { // default to string existingSchemaObject.setType("string"); } From debfed1611dc8762f3f482c92dd1ab45edaaa1d8 Mon Sep 17 00:00:00 2001 From: K5qu4r3d Date: Wed, 24 Sep 2025 14:22:28 -0400 Subject: [PATCH 02/31] fix: add type values to all PrimitiveType JSON schemas --- .../swagger/v3/core/util/PrimitiveType.java | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java index 4ec3b94ecc..24b996cb8c 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java @@ -38,7 +38,7 @@ public Schema createProperty() { } @Override public Schema createProperty31() { - return new JsonSchema().typesItem("string"); + return new JsonSchema().typesItem("string").type("string"); } }, BOOLEAN(Boolean.class, "boolean") { @@ -48,7 +48,7 @@ public Schema createProperty() { } @Override public Schema createProperty31() { - return new JsonSchema().typesItem("boolean"); + return new JsonSchema().typesItem("boolean").type("boolean"); } }, BYTE(Byte.class, "byte") { @@ -63,7 +63,7 @@ public Schema createProperty() { } @Override public Schema createProperty31() { - return new JsonSchema().typesItem("string").format("byte"); + return new JsonSchema().typesItem("string").type("string").format("byte"); } }, BINARY(Byte.class, "binary") { @@ -78,7 +78,7 @@ public Schema createProperty() { } @Override public Schema createProperty31() { - return new JsonSchema().typesItem("string").format("binary"); + return new JsonSchema().typesItem("string").type("string").format("binary"); } }, URI(java.net.URI.class, "uri") { @@ -88,7 +88,7 @@ public Schema createProperty() { } @Override public Schema createProperty31() { - return new JsonSchema().typesItem("string").format("uri"); + return new JsonSchema().typesItem("string").type("string").format("uri"); } }, URL(java.net.URL.class, "url") { @@ -98,7 +98,7 @@ public Schema createProperty() { } @Override public Schema createProperty31() { - return new JsonSchema().typesItem("string").format("url"); + return new JsonSchema().typesItem("string").type("string").format("url"); } }, EMAIL(String.class, "email") { @@ -108,7 +108,7 @@ public Schema createProperty() { } @Override public Schema createProperty31() { - return new JsonSchema().typesItem("string").format("email"); + return new JsonSchema().typesItem("string").type("string").format("email"); } }, UUID(java.util.UUID.class, "uuid") { @@ -118,7 +118,7 @@ public UUIDSchema createProperty() { } @Override public Schema createProperty31() { - return new JsonSchema().typesItem("string").format("uuid"); + return new JsonSchema().typesItem("string").type("string").format("uuid"); } }, INT(Integer.class, "integer") { @@ -128,7 +128,7 @@ public IntegerSchema createProperty() { } @Override public Schema createProperty31() { - return new JsonSchema().typesItem("integer").format("int32"); + return new JsonSchema().typesItem("integer").type("integer").format("int32"); } }, LONG(Long.class, "long") { @@ -138,7 +138,7 @@ public Schema createProperty() { } @Override public Schema createProperty31() { - return new JsonSchema().typesItem("integer").format("int64"); + return new JsonSchema().typesItem("integer").type("integer").format("int64"); } }, FLOAT(Float.class, "float") { @@ -148,7 +148,7 @@ public Schema createProperty() { } @Override public Schema createProperty31() { - return new JsonSchema().typesItem("number").format("float"); + return new JsonSchema().typesItem("number").type("number").format("float"); } }, DOUBLE(Double.class, "double") { @@ -158,7 +158,7 @@ public Schema createProperty() { } @Override public Schema createProperty31() { - return new JsonSchema().typesItem("number").format("double"); + return new JsonSchema().typesItem("number").type("number").format("double"); } }, INTEGER(java.math.BigInteger.class) { @@ -168,7 +168,7 @@ public Schema createProperty() { } @Override public Schema createProperty31() { - return new JsonSchema().typesItem("integer"); + return new JsonSchema().typesItem("integer").type("integer"); } }, DECIMAL(java.math.BigDecimal.class, "number") { @@ -178,7 +178,7 @@ public Schema createProperty() { } @Override public Schema createProperty31() { - return new JsonSchema().typesItem("number"); + return new JsonSchema().typesItem("number").type("number"); } }, NUMBER(Number.class, "number") { @@ -188,7 +188,7 @@ public Schema createProperty() { } @Override public Schema createProperty31() { - return new JsonSchema().typesItem("number"); + return new JsonSchema().typesItem("number").type("number"); } }, DATE(DateStub.class, "date") { @@ -198,7 +198,7 @@ public DateSchema createProperty() { } @Override public Schema createProperty31() { - return new JsonSchema().typesItem("string").format("date"); + return new JsonSchema().typesItem("string").type("string").format("date"); } }, DATE_TIME(java.util.Date.class, "date-time") { @@ -208,7 +208,7 @@ public DateTimeSchema createProperty() { } @Override public Schema createProperty31() { - return new JsonSchema().typesItem("string").format("date-time"); + return new JsonSchema().typesItem("string").type("string").format("date-time"); } }, PARTIAL_TIME(java.time.LocalTime.class, "partial-time") { @@ -218,7 +218,7 @@ public Schema createProperty() { } @Override public Schema createProperty31() { - return new JsonSchema().typesItem("string").format("partial-time"); + return new JsonSchema().typesItem("string").type("string").format("partial-time"); } }, FILE(java.io.File.class, "file") { @@ -228,7 +228,7 @@ public FileSchema createProperty() { } @Override public Schema createProperty31() { - return new JsonSchema().typesItem("string").format("binary"); + return new JsonSchema().typesItem("string").type("string").format("binary"); } }, OBJECT(Object.class) { @@ -239,7 +239,7 @@ public Schema createProperty() { } @Override public Schema createProperty31() { - return new JsonSchema(); + return new JsonSchema().typesItem("object").type("object"); } }; From 7c0a6afc0ce8a4e7e09e3d1a1954144bc65fb722 Mon Sep 17 00:00:00 2001 From: K5qu4r3d Date: Thu, 25 Sep 2025 11:24:11 -0400 Subject: [PATCH 03/31] fix: remove "type" and "types" value declarations from OBJECT enum --- .../src/main/java/io/swagger/v3/core/util/PrimitiveType.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java index 24b996cb8c..94f3c1ccc1 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java @@ -239,7 +239,7 @@ public Schema createProperty() { } @Override public Schema createProperty31() { - return new JsonSchema().typesItem("object").type("object"); + return new JsonSchema(); } }; From 4baa8046e99fdce627b0cf53d8a4463523bfe58b Mon Sep 17 00:00:00 2001 From: K5qu4r3d Date: Fri, 26 Sep 2025 13:28:54 -0400 Subject: [PATCH 04/31] Revert "fix: remove "type" and "types" value declarations from OBJECT enum" This reverts commit 7c0a6afc0ce8a4e7e09e3d1a1954144bc65fb722. --- .../src/main/java/io/swagger/v3/core/util/PrimitiveType.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java index 94f3c1ccc1..24b996cb8c 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java @@ -239,7 +239,7 @@ public Schema createProperty() { } @Override public Schema createProperty31() { - return new JsonSchema(); + return new JsonSchema().typesItem("object").type("object"); } }; From e8cfe79b816b8079e1e2ac226338c8d754542159 Mon Sep 17 00:00:00 2001 From: Kevin Date: Fri, 26 Sep 2025 14:34:25 -0400 Subject: [PATCH 05/31] fix: fix existing test cases --- .../resolving/v31/ModelResolverOAS31Test.java | 4 +++- .../java/io/swagger/v3/jaxrs2/ReaderTest.java | 6 ++++++ .../test/resources/petstore/WebHookResource.yaml | 8 ++++++-- .../callbacks/ComplexCallback31Resource.yaml | 8 ++++++-- .../parameters/Parameters31Resource.yaml | 4 +++- .../requestbody/RequestBody31Resource.yaml | 16 ++++++++++++---- 6 files changed, 36 insertions(+), 10 deletions(-) diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/v31/ModelResolverOAS31Test.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/v31/ModelResolverOAS31Test.java index 13b3d16213..0906332ee6 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/v31/ModelResolverOAS31Test.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/v31/ModelResolverOAS31Test.java @@ -131,6 +131,7 @@ public void testOAS31Fields() { " type: number\n" + " status:\n" + " type:\n" + + " - object\n" + " - string\n" + " - number\n" + " intValue:\n" + @@ -160,7 +161,8 @@ public void testOAS31Fields() { " creditCard:\n" + " $ref: \"#/components/schemas/CreditCard\"\n" + " properties:\n" + - " extraObject: {}\n" + + " extraObject: \n" + + " type: object\n" + "MultipleBaseBean:\n" + " type: object\n" + " description: MultipleBaseBean\n" + diff --git a/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/ReaderTest.java b/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/ReaderTest.java index 7d2eea8c2b..acf3259f66 100644 --- a/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/ReaderTest.java +++ b/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/ReaderTest.java @@ -3569,6 +3569,7 @@ public void testOas31Petstore() { " name:\n" + " type: string\n" + " annotated:\n" + + " type: object\n" + " $ref: \"#/components/schemas/Category\"\n" + " description: child description\n" + " properties:\n" + @@ -3623,6 +3624,7 @@ public void test31RefSiblings() { " type: object\n" + " properties:\n" + " annotated:\n" + + " type: \"object\"\n" + " $ref: \"#/components/schemas/SimpleCategory\"\n" + " description: child description\n" + " properties:\n" + @@ -4006,6 +4008,7 @@ public void testMisc31() { " type: number\n" + " status:\n" + " type:\n" + + " - object\n" + " - string\n" + " - number\n" + " intValue:\n" + @@ -4085,6 +4088,7 @@ public void testMisc31() { " type: object\n" + " properties:\n" + " country:\n" + + " type: object\n" + " const: United States\n" + " CreditCard:\n" + " type: object\n" + @@ -4095,11 +4099,13 @@ public void testMisc31() { " type: object\n" + " properties:\n" + " postalCode:\n" + + " type: object\n" + " pattern: \"[0-9]{5}(-[0-9]{4})?\"\n" + " PostalCodePattern:\n" + " type: object\n" + " properties:\n" + " postalCode:\n" + + " type: object\n" + " pattern: \"[A-Z][0-9][A-Z] [0-9][A-Z][0-9]\"\n" + " PropertyNamesPattern:\n" + " pattern: \"^[A-Za-z_][A-Za-z0-9_]*$\"\n"; diff --git a/modules/swagger-jaxrs2/src/test/resources/petstore/WebHookResource.yaml b/modules/swagger-jaxrs2/src/test/resources/petstore/WebHookResource.yaml index 62e397cade..c1376f1ae2 100644 --- a/modules/swagger-jaxrs2/src/test/resources/petstore/WebHookResource.yaml +++ b/modules/swagger-jaxrs2/src/test/resources/petstore/WebHookResource.yaml @@ -24,9 +24,13 @@ webhooks: $comment: random comment $id: http://yourdomain.com/schemas/myschema.json dependentSchemas: - pet: {} + pet: { + type: object + } patternProperties: - user: {} + user: { + type: object + } webhook1: post: description: "subscribes a client to updates relevant to the requestor's account,\ diff --git a/modules/swagger-jaxrs2/src/test/resources/petstore/callbacks/ComplexCallback31Resource.yaml b/modules/swagger-jaxrs2/src/test/resources/petstore/callbacks/ComplexCallback31Resource.yaml index 79189d9464..9195e13b7b 100644 --- a/modules/swagger-jaxrs2/src/test/resources/petstore/callbacks/ComplexCallback31Resource.yaml +++ b/modules/swagger-jaxrs2/src/test/resources/petstore/callbacks/ComplexCallback31Resource.yaml @@ -32,9 +32,13 @@ paths: $comment: random comment $id: http://yourdomain.com/schemas/myschema.json dependentSchemas: - pet: { } + pet: { + type: object + } patternProperties: - user: { } + user: { + type: object + } testCallback2: http://www.url2.com: get: diff --git a/modules/swagger-jaxrs2/src/test/resources/petstore/parameters/Parameters31Resource.yaml b/modules/swagger-jaxrs2/src/test/resources/petstore/parameters/Parameters31Resource.yaml index e42efe9760..b6c10e120c 100644 --- a/modules/swagger-jaxrs2/src/test/resources/petstore/parameters/Parameters31Resource.yaml +++ b/modules/swagger-jaxrs2/src/test/resources/petstore/parameters/Parameters31Resource.yaml @@ -96,7 +96,9 @@ paths: user: $ref: "#/components/schemas/User" properties: - extraObject: {} + extraObject: { + type: object + } components: schemas: Category: diff --git a/modules/swagger-jaxrs2/src/test/resources/petstore/requestbody/RequestBody31Resource.yaml b/modules/swagger-jaxrs2/src/test/resources/petstore/requestbody/RequestBody31Resource.yaml index 2c5b00cc76..24f6143ae8 100644 --- a/modules/swagger-jaxrs2/src/test/resources/petstore/requestbody/RequestBody31Resource.yaml +++ b/modules/swagger-jaxrs2/src/test/resources/petstore/requestbody/RequestBody31Resource.yaml @@ -40,16 +40,24 @@ paths: - string - number - object - if: {} - then: {} - else: {} + if: { + type: object + } + then: { + type: object + } + else: { + type: object + } $anchor: parameter $anchor $schema: parameter $schema description: User description example: User Description exclusiveMaximum: 100 exclusiveMinimum: 1 - unevaluatedProperties: {} + unevaluatedProperties: { + type: object + } required: true responses: default: From 02179c13b2f294a41821f4d50a29a2e68fc16292 Mon Sep 17 00:00:00 2001 From: K5qu4r3d Date: Tue, 30 Sep 2025 11:07:18 -0400 Subject: [PATCH 06/31] fix: fix existing test cases pt. 2 --- .../swagger/v3/java17/resolving/v31/ModelResolverOAS31Test.java | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/swagger-java17-support/src/test/java/io/swagger/v3/java17/resolving/v31/ModelResolverOAS31Test.java b/modules/swagger-java17-support/src/test/java/io/swagger/v3/java17/resolving/v31/ModelResolverOAS31Test.java index 902f4336da..f16b986d93 100644 --- a/modules/swagger-java17-support/src/test/java/io/swagger/v3/java17/resolving/v31/ModelResolverOAS31Test.java +++ b/modules/swagger-java17-support/src/test/java/io/swagger/v3/java17/resolving/v31/ModelResolverOAS31Test.java @@ -37,6 +37,7 @@ public void testOAS31JavaRecord() { " type: number\n" + " Status:\n" + " type:\n" + + " - object\n" + " - string\n" + " - number\n"; From 23253a25ff3dff2736b2021e7bc8d195a3ec3eef Mon Sep 17 00:00:00 2001 From: K5qu4r3d Date: Tue, 30 Sep 2025 11:13:55 -0400 Subject: [PATCH 07/31] fix: update access modifier of class PrimitiveType.DateStub --- .../src/main/java/io/swagger/v3/core/util/PrimitiveType.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java index 24b996cb8c..05c9202b1f 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java @@ -572,7 +572,7 @@ private static void addMultiKeys(Map> map, Prim } } - private static class DateStub { + public static class DateStub { private DateStub() { } } From 26ab40762a88b7b5accf9775f333eeac30470a4e Mon Sep 17 00:00:00 2001 From: K5qu4r3d Date: Fri, 3 Oct 2025 10:40:10 -0400 Subject: [PATCH 08/31] test: add test cases for updated OpenAPI 3.1 "type"/"types" value schemas --- .../v3/jaxrs2/APIResponsesResourceTest.java | 171 +++++++++++++++ .../resources/APIResponsesResource.java | 200 ++++++++++++++++++ 2 files changed, 371 insertions(+) create mode 100644 modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/APIResponsesResourceTest.java create mode 100644 modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/resources/APIResponsesResource.java diff --git a/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/APIResponsesResourceTest.java b/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/APIResponsesResourceTest.java new file mode 100644 index 0000000000..8e46de0338 --- /dev/null +++ b/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/APIResponsesResourceTest.java @@ -0,0 +1,171 @@ +package io.swagger.v3.jaxrs2; + +import io.swagger.v3.jaxrs2.resources.APIResponsesResource; +import io.swagger.v3.oas.integration.SwaggerConfiguration; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.Operation; +import io.swagger.v3.oas.models.media.Schema; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import static org.testng.AssertJUnit.assertEquals; + +public class APIResponsesResourceTest { + private OpenAPI openAPI; + + @BeforeMethod + public void setUp() { + SwaggerConfiguration config = new SwaggerConfiguration().openAPI31(true); + Reader reader = new Reader(config); + openAPI = reader.read(APIResponsesResource.class); + } + + private Schema getResponseSchema(String path) { + Operation postOperation = openAPI.getPaths().get(path).getPost(); + return postOperation.getResponses().get("200").getContent().get("*/*").getSchema(); + } + + @Test + public void testStringOrEmailSchemaAPIResource31() { + Schema responseSchema = getResponseSchema("/postStringOrEmailSchemaContent"); + + // Value of field "type" must equal value of field "types" + assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); + } + + @Test + public void testBooleanSchemaAPIResource31() { + Schema responseSchema = getResponseSchema("/postBooleanSchemaContent"); + + // Value of field "type" must equal value of field "types" + assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); + } + + @Test + public void testByteOrBinarySchemaAPIResource31() { + Schema responseSchema = getResponseSchema("/postByteOrBinarySchemaContent"); + + // Value of field "type" must equal value of field "types" + assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); + } + + @Test + public void testURISchemaAPIResource31() { + Schema responseSchema = getResponseSchema("/postURISchemaContent"); + + // Value of field "type" must equal value of field "types" + assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); + } + + @Test + public void testURLSchemaAPIResource31() { + Schema responseSchema = getResponseSchema("/postURLSchemaContent"); + + // Value of field "type" must equal value of field "types" + assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); + } + + @Test + public void testUUIDSchemaAPIResource31() { + Schema responseSchema = getResponseSchema("/postUUIDSchemaContent"); + + // Value of field "type" must equal value of field "types" + assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); + } + + @Test + public void testIntegerSchemaAPIResource31() { + Schema responseSchema = getResponseSchema("/postIntegerSchemaContent"); + + // Value of field "type" must equal value of field "types" + assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); + } + + @Test + public void testLongSchemaAPIResource31() { + Schema responseSchema = getResponseSchema("/postLongSchemaContent"); + + // Value of field "type" must equal value of field "types" + assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); + } + + @Test + public void testFloatSchemaAPIResource31() { + Schema responseSchema = getResponseSchema("/postFloatSchemaContent"); + + // Value of field "type" must equal value of field "types" + assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); + } + + @Test + public void testDoubleSchemaAPIResource31() { + Schema responseSchema = getResponseSchema("/postDoubleSchemaContent"); + + // Value of field "type" must equal value of field "types" + assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); + } + + @Test + public void testBigIntegerSchemaAPIResource31() { + Schema responseSchema = getResponseSchema("/postBigIntegerSchemaContent"); + + // Value of field "type" must equal value of field "types" + assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); + } + + @Test + public void testBigDecimalSchemaAPIResource31() { + Schema responseSchema = getResponseSchema("/postBigDecimalSchemaContent"); + + // Value of field "type" must equal value of field "types" + assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); + } + + @Test + public void testNumberSchemaAPIResource31() { + Schema responseSchema = getResponseSchema("/postNumberSchemaContent"); + + // Value of field "type" must equal value of field "types" + assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); + } + + @Test + public void testDateStubSchemaAPIResource31() { + Schema responseSchema = getResponseSchema("/postDateStubSchemaContent"); + + // Value of field "type" must equal value of field "types" + assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); + } + + @Test + public void testDateSchemaAPIResource31() { + Schema responseSchema = getResponseSchema("/postDateSchemaContent"); + + // Value of field "type" must equal value of field "types" + assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); + } + + @Test + public void testLocalTimeSchemaAPIResource31() { + Schema responseSchema = getResponseSchema("/postLocalTimeSchemaContent"); + + // Value of field "type" must equal value of field "types" + assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); + } + + @Test + public void testFileSchemaAPIResource31() { + Schema responseSchema = getResponseSchema("/postFileSchemaContent"); + + // Value of field "type" must equal value of field "types" + assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); + } + + @Test + public void testObjectSchemaAPIResource31() { + Schema responseSchema = getResponseSchema("/postObjectSchemaContent"); + + // Value of field "type" must equal value of field "types" + assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); + } +} \ No newline at end of file diff --git a/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/resources/APIResponsesResource.java b/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/resources/APIResponsesResource.java new file mode 100644 index 0000000000..95d05aee99 --- /dev/null +++ b/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/resources/APIResponsesResource.java @@ -0,0 +1,200 @@ +package io.swagger.v3.jaxrs2.resources; + +import io.swagger.v3.core.util.PrimitiveType; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; + +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import java.io.File; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.net.URI; +import java.net.URL; +import java.time.LocalTime; +import java.util.Date; +import java.util.UUID; + +public class APIResponsesResource { + @POST + @Path("postStringOrEmailSchemaContent") + @ApiResponses({ + @ApiResponse( + responseCode = "200", + content = @Content(schema = @Schema(implementation = String.class)) + ) + }) + public void postStringOrEmailSchemaContent() { } + + @POST + @Path("postBooleanSchemaContent") + @ApiResponses({ + @ApiResponse( + responseCode = "200", + content = @Content(schema = @Schema(implementation = Boolean.class)) + ) + }) + public void postBooleanSchemaContent() { } + + @POST + @Path("postByteOrBinarySchemaContent") + @ApiResponses({ + @ApiResponse( + responseCode = "200", + content = @Content(schema = @Schema(implementation = Byte.class)) + ) + }) + public void postByteOrBinarySchemaContent() { } + + @POST + @Path("postURISchemaContent") + @ApiResponses({ + @ApiResponse( + responseCode = "200", + content = @Content(schema = @Schema(implementation = URI.class)) + ) + }) + public void postURISchemaContent() { } + + @POST + @Path("postURLSchemaContent") + @ApiResponses({ + @ApiResponse( + responseCode = "200", + content = @Content(schema = @Schema(implementation = URL.class)) + ) + }) + public void postURLSchemaContent() { } + + @POST + @Path("postUUIDSchemaContent") + @ApiResponses({ + @ApiResponse( + responseCode = "200", + content = @Content(schema = @Schema(implementation = UUID.class)) + ) + }) + public void postUUIDSchemaContent() { } + + @POST + @Path("postIntegerSchemaContent") + @ApiResponses({ + @ApiResponse( + responseCode = "200", + content = @Content(schema = @Schema(implementation = Integer.class)) + ) + }) + public void postIntegerSchemaContent() { } + + @POST + @Path("postLongSchemaContent") + @ApiResponses({ + @ApiResponse( + responseCode = "200", + content = @Content(schema = @Schema(implementation = Long.class)) + ) + }) + public void postLongSchemaContent() { } + + @POST + @Path("postFloatSchemaContent") + @ApiResponses({ + @ApiResponse( + responseCode = "200", + content = @Content(schema = @Schema(implementation = Float.class)) + ) + }) + public void postFloatSchemaContent() { } + + @POST + @Path("postDoubleSchemaContent") + @ApiResponses({ + @ApiResponse( + responseCode = "200", + content = @Content(schema = @Schema(implementation = Double.class)) + ) + }) + public void postDoubleSchemaContent() { } + + @POST + @Path("postBigIntegerSchemaContent") + @ApiResponses({ + @ApiResponse( + responseCode = "200", + content = @Content(schema = @Schema(implementation = BigInteger.class)) + ) + }) + public void postBigIntegerSchemaContent() { } + + @POST + @Path("postBigDecimalSchemaContent") + @ApiResponses({ + @ApiResponse( + responseCode = "200", + content = @Content(schema = @Schema(implementation = BigDecimal.class)) + ) + }) + public void postBigDecimalSchemaContent() { } + + @POST + @Path("postNumberSchemaContent") + @ApiResponses({ + @ApiResponse( + responseCode = "200", + content = @Content(schema = @Schema(implementation = Number.class)) + ) + }) + public void postNumberSchemaContent() { } + + @POST + @Path("postDateStubSchemaContent") + @ApiResponses({ + @ApiResponse( + responseCode = "200", + content = @Content(schema = @Schema(implementation = PrimitiveType.DateStub.class)) + ) + }) + public void postDateStubSchemaContent() { } + + @POST + @Path("postDateSchemaContent") + @ApiResponses({ + @ApiResponse( + responseCode = "200", + content = @Content(schema = @Schema(implementation = Date.class)) + ) + }) + public void postDateSchemaContent() { } + + @POST + @Path("postLocalTimeSchemaContent") + @ApiResponses({ + @ApiResponse( + responseCode = "200", + content = @Content(schema = @Schema(implementation = LocalTime.class)) + ) + }) + public void postLocalTimeSchemaContent() { } + + @POST + @Path("postFileSchemaContent") + @ApiResponses({ + @ApiResponse( + responseCode = "200", + content = @Content(schema = @Schema(implementation = File.class)) + ) + }) + public void postFileSchemaContent() { } + + @POST + @Path("postObjectSchemaContent") + @ApiResponses({ + @ApiResponse( + responseCode = "200", + content = @Content(schema = @Schema(implementation = Object.class)) + ) + }) + public void postObjectSchemaContent() { } +} From ecb89295ea53fbc0d93f4c7f3cd44d209cb9f9f3 Mon Sep 17 00:00:00 2001 From: K5qu4r3d Date: Fri, 3 Oct 2025 10:41:49 -0400 Subject: [PATCH 09/31] fix: update type values for date/time 3.1 schemas --- .../main/java/io/swagger/v3/core/util/PrimitiveType.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java index 05c9202b1f..8960cb91db 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java @@ -198,7 +198,7 @@ public DateSchema createProperty() { } @Override public Schema createProperty31() { - return new JsonSchema().typesItem("string").type("string").format("date"); + return new JsonSchema().typesItem("object").type("object").format("date"); } }, DATE_TIME(java.util.Date.class, "date-time") { @@ -208,7 +208,7 @@ public DateTimeSchema createProperty() { } @Override public Schema createProperty31() { - return new JsonSchema().typesItem("string").type("string").format("date-time"); + return new JsonSchema().typesItem("object").type("object").format("date-time"); } }, PARTIAL_TIME(java.time.LocalTime.class, "partial-time") { @@ -218,7 +218,7 @@ public Schema createProperty() { } @Override public Schema createProperty31() { - return new JsonSchema().typesItem("string").type("string").format("partial-time"); + return new JsonSchema().typesItem("object").type("object").format("partial-time"); } }, FILE(java.io.File.class, "file") { @@ -337,6 +337,7 @@ public Schema createProperty31() { addKeys(keyClasses, NUMBER, Number.class); addKeys(keyClasses, DATE, DateStub.class); addKeys(keyClasses, DATE_TIME, java.util.Date.class); +// addKeys(keyClasses, PARTIAL_TIME, java.time.LocalTime.class); addKeys(keyClasses, FILE, java.io.File.class); addKeys(keyClasses, OBJECT, Object.class); KEY_CLASSES = Collections.unmodifiableMap(keyClasses); From e4d7b454d482d0ea1410f0ffd08e3e2f129a94bf Mon Sep 17 00:00:00 2001 From: K5qu4r3d Date: Tue, 7 Oct 2025 13:47:40 -0400 Subject: [PATCH 10/31] fix: add "LocalTime" class mappings for PARTIAL_TIME --- .../src/main/java/io/swagger/v3/core/util/PrimitiveType.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java index 8960cb91db..54581a910d 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java @@ -375,6 +375,9 @@ public Schema createProperty31() { addKeys(names, OBJECT, "object"); NAMES = Collections.unmodifiableMap(names); + // Add "LocalTime" class mappings + enablePartialTime(); + if (System.getenv(Schema.EXPLICIT_OBJECT_SCHEMA_PROPERTY) != null) { explicitObjectType = Boolean.parseBoolean(System.getenv(Schema.EXPLICIT_OBJECT_SCHEMA_PROPERTY)); } else if (System.getProperty(Schema.EXPLICIT_OBJECT_SCHEMA_PROPERTY) != null) { From 75bc935601ec85bca2ee4ab9ec7db63c65a7c286 Mon Sep 17 00:00:00 2001 From: K5qu4r3d Date: Tue, 7 Oct 2025 13:50:02 -0400 Subject: [PATCH 11/31] fix: remove duplicate "LocalTime" model from expected YAML --- .../v3/core/resolving/Ticket2992Test.java | 42 ------------------- 1 file changed, 42 deletions(-) diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/Ticket2992Test.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/Ticket2992Test.java index 75eebf5df4..b1db707a72 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/Ticket2992Test.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/Ticket2992Test.java @@ -18,48 +18,6 @@ public void testLocalTime() throws Exception { ModelConverterContextImpl context = new ModelConverterContextImpl(modelResolver); - Schema model = context - .resolve(new AnnotatedType(TestObject2992.class)); - - SerializationMatchers.assertEqualsToYaml(context.getDefinedModels(), "LocalTime:\n" + - " type: object\n" + - " properties:\n" + - " hour:\n" + - " type: integer\n" + - " format: int32\n" + - " minute:\n" + - " type: integer\n" + - " format: int32\n" + - " second:\n" + - " type: integer\n" + - " format: int32\n" + - " nano:\n" + - " type: integer\n" + - " format: int32\n" + - "TestObject2992:\n" + - " type: object\n" + - " properties:\n" + - " name:\n" + - " type: string\n" + - " a:\n" + - " $ref: \"#/components/schemas/LocalTime\"\n" + - " b:\n" + - " $ref: \"#/components/schemas/LocalTime\"\n" + - " c:\n" + - " $ref: \"#/components/schemas/LocalTime\"\n" + - " d:\n" + - " type: string\n" + - " format: date-time\n" + - " e:\n" + - " type: string\n" + - " format: date-time\n" + - " f:\n" + - " type: string\n" + - " format: date-time"); - - PrimitiveType.enablePartialTime(); - context = new ModelConverterContextImpl(modelResolver); - context .resolve(new AnnotatedType(TestObject2992.class)); From 935dacd64454ea37b76465d5051a04e7035eb369 Mon Sep 17 00:00:00 2001 From: Kevin Date: Wed, 8 Oct 2025 11:17:40 -0400 Subject: [PATCH 12/31] fix: convert APIResponsesResourceTest to parameterized test --- .../v3/jaxrs2/APIResponsesResourceTest.java | 168 +++--------------- 1 file changed, 29 insertions(+), 139 deletions(-) diff --git a/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/APIResponsesResourceTest.java b/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/APIResponsesResourceTest.java index 8e46de0338..2b0b2f5615 100644 --- a/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/APIResponsesResourceTest.java +++ b/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/APIResponsesResourceTest.java @@ -6,6 +6,7 @@ import io.swagger.v3.oas.models.Operation; import io.swagger.v3.oas.models.media.Schema; import org.testng.annotations.BeforeMethod; +import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import static org.testng.AssertJUnit.assertEquals; @@ -13,6 +14,31 @@ public class APIResponsesResourceTest { private OpenAPI openAPI; + // Prepare list of resource schema URLs + @DataProvider(name = "schemas") + public String[] getSchemas() { + return new String[] { + "/postStringOrEmailSchemaContent", + "/postBooleanSchemaContent", + "/postByteOrBinarySchemaContent", + "/postURISchemaContent", + "/postURLSchemaContent", + "/postUUIDSchemaContent", + "/postIntegerSchemaContent", + "/postLongSchemaContent", + "/postFloatSchemaContent", + "/postDoubleSchemaContent", + "/postBigIntegerSchemaContent", + "/postBigDecimalSchemaContent", + "/postNumberSchemaContent", + "/postDateStubSchemaContent", + "/postDateSchemaContent", + "/postLocalTimeSchemaContent", + "/postFileSchemaContent", + "/postObjectSchemaContent" + }; + } + @BeforeMethod public void setUp() { SwaggerConfiguration config = new SwaggerConfiguration().openAPI31(true); @@ -25,145 +51,9 @@ private Schema getResponseSchema(String path) { return postOperation.getResponses().get("200").getContent().get("*/*").getSchema(); } - @Test - public void testStringOrEmailSchemaAPIResource31() { - Schema responseSchema = getResponseSchema("/postStringOrEmailSchemaContent"); - - // Value of field "type" must equal value of field "types" - assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); - } - - @Test - public void testBooleanSchemaAPIResource31() { - Schema responseSchema = getResponseSchema("/postBooleanSchemaContent"); - - // Value of field "type" must equal value of field "types" - assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); - } - - @Test - public void testByteOrBinarySchemaAPIResource31() { - Schema responseSchema = getResponseSchema("/postByteOrBinarySchemaContent"); - - // Value of field "type" must equal value of field "types" - assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); - } - - @Test - public void testURISchemaAPIResource31() { - Schema responseSchema = getResponseSchema("/postURISchemaContent"); - - // Value of field "type" must equal value of field "types" - assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); - } - - @Test - public void testURLSchemaAPIResource31() { - Schema responseSchema = getResponseSchema("/postURLSchemaContent"); - - // Value of field "type" must equal value of field "types" - assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); - } - - @Test - public void testUUIDSchemaAPIResource31() { - Schema responseSchema = getResponseSchema("/postUUIDSchemaContent"); - - // Value of field "type" must equal value of field "types" - assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); - } - - @Test - public void testIntegerSchemaAPIResource31() { - Schema responseSchema = getResponseSchema("/postIntegerSchemaContent"); - - // Value of field "type" must equal value of field "types" - assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); - } - - @Test - public void testLongSchemaAPIResource31() { - Schema responseSchema = getResponseSchema("/postLongSchemaContent"); - - // Value of field "type" must equal value of field "types" - assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); - } - - @Test - public void testFloatSchemaAPIResource31() { - Schema responseSchema = getResponseSchema("/postFloatSchemaContent"); - - // Value of field "type" must equal value of field "types" - assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); - } - - @Test - public void testDoubleSchemaAPIResource31() { - Schema responseSchema = getResponseSchema("/postDoubleSchemaContent"); - - // Value of field "type" must equal value of field "types" - assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); - } - - @Test - public void testBigIntegerSchemaAPIResource31() { - Schema responseSchema = getResponseSchema("/postBigIntegerSchemaContent"); - - // Value of field "type" must equal value of field "types" - assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); - } - - @Test - public void testBigDecimalSchemaAPIResource31() { - Schema responseSchema = getResponseSchema("/postBigDecimalSchemaContent"); - - // Value of field "type" must equal value of field "types" - assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); - } - - @Test - public void testNumberSchemaAPIResource31() { - Schema responseSchema = getResponseSchema("/postNumberSchemaContent"); - - // Value of field "type" must equal value of field "types" - assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); - } - - @Test - public void testDateStubSchemaAPIResource31() { - Schema responseSchema = getResponseSchema("/postDateStubSchemaContent"); - - // Value of field "type" must equal value of field "types" - assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); - } - - @Test - public void testDateSchemaAPIResource31() { - Schema responseSchema = getResponseSchema("/postDateSchemaContent"); - - // Value of field "type" must equal value of field "types" - assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); - } - - @Test - public void testLocalTimeSchemaAPIResource31() { - Schema responseSchema = getResponseSchema("/postLocalTimeSchemaContent"); - - // Value of field "type" must equal value of field "types" - assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); - } - - @Test - public void testFileSchemaAPIResource31() { - Schema responseSchema = getResponseSchema("/postFileSchemaContent"); - - // Value of field "type" must equal value of field "types" - assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); - } - - @Test - public void testObjectSchemaAPIResource31() { - Schema responseSchema = getResponseSchema("/postObjectSchemaContent"); + @Test(dataProvider = "schemas") + public void testSchemaAPIResource31(String schema) { + Schema responseSchema = getResponseSchema(schema); // Value of field "type" must equal value of field "types" assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); From cecddf13908b581524216e46e4d825e563826402 Mon Sep 17 00:00:00 2001 From: Kevin Date: Mon, 3 Nov 2025 08:51:45 -0500 Subject: [PATCH 13/31] fix: remove unnecessary comment --- .../src/main/java/io/swagger/v3/core/util/PrimitiveType.java | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java index 54581a910d..3b7e2fe825 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java @@ -337,7 +337,6 @@ public Schema createProperty31() { addKeys(keyClasses, NUMBER, Number.class); addKeys(keyClasses, DATE, DateStub.class); addKeys(keyClasses, DATE_TIME, java.util.Date.class); -// addKeys(keyClasses, PARTIAL_TIME, java.time.LocalTime.class); addKeys(keyClasses, FILE, java.io.File.class); addKeys(keyClasses, OBJECT, Object.class); KEY_CLASSES = Collections.unmodifiableMap(keyClasses); From e6beba398dea2cd9664c393219a84fef751134d0 Mon Sep 17 00:00:00 2001 From: Kevin Date: Mon, 3 Nov 2025 08:52:09 -0500 Subject: [PATCH 14/31] fix: remove enablePartialTime() call --- .../src/main/java/io/swagger/v3/core/util/PrimitiveType.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java index 3b7e2fe825..3948af72c3 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java @@ -374,9 +374,6 @@ public Schema createProperty31() { addKeys(names, OBJECT, "object"); NAMES = Collections.unmodifiableMap(names); - // Add "LocalTime" class mappings - enablePartialTime(); - if (System.getenv(Schema.EXPLICIT_OBJECT_SCHEMA_PROPERTY) != null) { explicitObjectType = Boolean.parseBoolean(System.getenv(Schema.EXPLICIT_OBJECT_SCHEMA_PROPERTY)); } else if (System.getProperty(Schema.EXPLICIT_OBJECT_SCHEMA_PROPERTY) != null) { From c0da882d894d6baca2b08808ad7bd353e77172f7 Mon Sep 17 00:00:00 2001 From: Kevin Date: Mon, 3 Nov 2025 09:02:23 -0500 Subject: [PATCH 15/31] fix: rename variable for clarity --- .../main/java/io/swagger/v3/core/util/AnnotationsUtils.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/AnnotationsUtils.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/AnnotationsUtils.java index 6177f75078..cc101d4659 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/AnnotationsUtils.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/AnnotationsUtils.java @@ -951,10 +951,10 @@ public static Schema resolveSchemaFromType(Class schemaImplementation, Compon existingSchemaObject = reResolvedSchema.get(); } } - boolean doesSchemaHaveTypes = existingSchemaObject.getTypes() == null || existingSchemaObject.getTypes().isEmpty(); + boolean doesSchemaHaveNullOrEmptyTypes = existingSchemaObject.getTypes() == null || existingSchemaObject.getTypes().isEmpty(); if (StringUtils.isBlank(existingSchemaObject.get$ref()) && StringUtils.isBlank(existingSchemaObject.getType()) - && doesSchemaHaveTypes) { + && doesSchemaHaveNullOrEmptyTypes) { // default to string existingSchemaObject.setType("string"); } From 3b6d4a81f13b03b791d475e4655768bd7bb6bad9 Mon Sep 17 00:00:00 2001 From: K5qu4r3d Date: Wed, 24 Sep 2025 13:33:54 -0400 Subject: [PATCH 16/31] fix: verify Schema object getTypes() is not null or empty --- .../main/java/io/swagger/v3/core/util/AnnotationsUtils.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/AnnotationsUtils.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/AnnotationsUtils.java index e331732722..6177f75078 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/AnnotationsUtils.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/AnnotationsUtils.java @@ -951,7 +951,10 @@ public static Schema resolveSchemaFromType(Class schemaImplementation, Compon existingSchemaObject = reResolvedSchema.get(); } } - if (StringUtils.isBlank(existingSchemaObject.get$ref()) && StringUtils.isBlank(existingSchemaObject.getType())) { + boolean doesSchemaHaveTypes = existingSchemaObject.getTypes() == null || existingSchemaObject.getTypes().isEmpty(); + if (StringUtils.isBlank(existingSchemaObject.get$ref()) + && StringUtils.isBlank(existingSchemaObject.getType()) + && doesSchemaHaveTypes) { // default to string existingSchemaObject.setType("string"); } From 156a10eee0ac3b16fddcaf53182c84d939b3529d Mon Sep 17 00:00:00 2001 From: K5qu4r3d Date: Wed, 24 Sep 2025 14:22:28 -0400 Subject: [PATCH 17/31] fix: add type values to all PrimitiveType JSON schemas --- .../swagger/v3/core/util/PrimitiveType.java | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java index 4ec3b94ecc..24b996cb8c 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java @@ -38,7 +38,7 @@ public Schema createProperty() { } @Override public Schema createProperty31() { - return new JsonSchema().typesItem("string"); + return new JsonSchema().typesItem("string").type("string"); } }, BOOLEAN(Boolean.class, "boolean") { @@ -48,7 +48,7 @@ public Schema createProperty() { } @Override public Schema createProperty31() { - return new JsonSchema().typesItem("boolean"); + return new JsonSchema().typesItem("boolean").type("boolean"); } }, BYTE(Byte.class, "byte") { @@ -63,7 +63,7 @@ public Schema createProperty() { } @Override public Schema createProperty31() { - return new JsonSchema().typesItem("string").format("byte"); + return new JsonSchema().typesItem("string").type("string").format("byte"); } }, BINARY(Byte.class, "binary") { @@ -78,7 +78,7 @@ public Schema createProperty() { } @Override public Schema createProperty31() { - return new JsonSchema().typesItem("string").format("binary"); + return new JsonSchema().typesItem("string").type("string").format("binary"); } }, URI(java.net.URI.class, "uri") { @@ -88,7 +88,7 @@ public Schema createProperty() { } @Override public Schema createProperty31() { - return new JsonSchema().typesItem("string").format("uri"); + return new JsonSchema().typesItem("string").type("string").format("uri"); } }, URL(java.net.URL.class, "url") { @@ -98,7 +98,7 @@ public Schema createProperty() { } @Override public Schema createProperty31() { - return new JsonSchema().typesItem("string").format("url"); + return new JsonSchema().typesItem("string").type("string").format("url"); } }, EMAIL(String.class, "email") { @@ -108,7 +108,7 @@ public Schema createProperty() { } @Override public Schema createProperty31() { - return new JsonSchema().typesItem("string").format("email"); + return new JsonSchema().typesItem("string").type("string").format("email"); } }, UUID(java.util.UUID.class, "uuid") { @@ -118,7 +118,7 @@ public UUIDSchema createProperty() { } @Override public Schema createProperty31() { - return new JsonSchema().typesItem("string").format("uuid"); + return new JsonSchema().typesItem("string").type("string").format("uuid"); } }, INT(Integer.class, "integer") { @@ -128,7 +128,7 @@ public IntegerSchema createProperty() { } @Override public Schema createProperty31() { - return new JsonSchema().typesItem("integer").format("int32"); + return new JsonSchema().typesItem("integer").type("integer").format("int32"); } }, LONG(Long.class, "long") { @@ -138,7 +138,7 @@ public Schema createProperty() { } @Override public Schema createProperty31() { - return new JsonSchema().typesItem("integer").format("int64"); + return new JsonSchema().typesItem("integer").type("integer").format("int64"); } }, FLOAT(Float.class, "float") { @@ -148,7 +148,7 @@ public Schema createProperty() { } @Override public Schema createProperty31() { - return new JsonSchema().typesItem("number").format("float"); + return new JsonSchema().typesItem("number").type("number").format("float"); } }, DOUBLE(Double.class, "double") { @@ -158,7 +158,7 @@ public Schema createProperty() { } @Override public Schema createProperty31() { - return new JsonSchema().typesItem("number").format("double"); + return new JsonSchema().typesItem("number").type("number").format("double"); } }, INTEGER(java.math.BigInteger.class) { @@ -168,7 +168,7 @@ public Schema createProperty() { } @Override public Schema createProperty31() { - return new JsonSchema().typesItem("integer"); + return new JsonSchema().typesItem("integer").type("integer"); } }, DECIMAL(java.math.BigDecimal.class, "number") { @@ -178,7 +178,7 @@ public Schema createProperty() { } @Override public Schema createProperty31() { - return new JsonSchema().typesItem("number"); + return new JsonSchema().typesItem("number").type("number"); } }, NUMBER(Number.class, "number") { @@ -188,7 +188,7 @@ public Schema createProperty() { } @Override public Schema createProperty31() { - return new JsonSchema().typesItem("number"); + return new JsonSchema().typesItem("number").type("number"); } }, DATE(DateStub.class, "date") { @@ -198,7 +198,7 @@ public DateSchema createProperty() { } @Override public Schema createProperty31() { - return new JsonSchema().typesItem("string").format("date"); + return new JsonSchema().typesItem("string").type("string").format("date"); } }, DATE_TIME(java.util.Date.class, "date-time") { @@ -208,7 +208,7 @@ public DateTimeSchema createProperty() { } @Override public Schema createProperty31() { - return new JsonSchema().typesItem("string").format("date-time"); + return new JsonSchema().typesItem("string").type("string").format("date-time"); } }, PARTIAL_TIME(java.time.LocalTime.class, "partial-time") { @@ -218,7 +218,7 @@ public Schema createProperty() { } @Override public Schema createProperty31() { - return new JsonSchema().typesItem("string").format("partial-time"); + return new JsonSchema().typesItem("string").type("string").format("partial-time"); } }, FILE(java.io.File.class, "file") { @@ -228,7 +228,7 @@ public FileSchema createProperty() { } @Override public Schema createProperty31() { - return new JsonSchema().typesItem("string").format("binary"); + return new JsonSchema().typesItem("string").type("string").format("binary"); } }, OBJECT(Object.class) { @@ -239,7 +239,7 @@ public Schema createProperty() { } @Override public Schema createProperty31() { - return new JsonSchema(); + return new JsonSchema().typesItem("object").type("object"); } }; From 860c6352814287ccfcc8ff398d9fe41561b020d4 Mon Sep 17 00:00:00 2001 From: K5qu4r3d Date: Thu, 25 Sep 2025 11:24:11 -0400 Subject: [PATCH 18/31] fix: remove "type" and "types" value declarations from OBJECT enum --- .../src/main/java/io/swagger/v3/core/util/PrimitiveType.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java index 24b996cb8c..94f3c1ccc1 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java @@ -239,7 +239,7 @@ public Schema createProperty() { } @Override public Schema createProperty31() { - return new JsonSchema().typesItem("object").type("object"); + return new JsonSchema(); } }; From d5004bee388a488329e0a4647c7d932d27cb76fe Mon Sep 17 00:00:00 2001 From: K5qu4r3d Date: Fri, 26 Sep 2025 13:28:54 -0400 Subject: [PATCH 19/31] Revert "fix: remove "type" and "types" value declarations from OBJECT enum" This reverts commit 7c0a6afc0ce8a4e7e09e3d1a1954144bc65fb722. --- .../src/main/java/io/swagger/v3/core/util/PrimitiveType.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java index 94f3c1ccc1..24b996cb8c 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java @@ -239,7 +239,7 @@ public Schema createProperty() { } @Override public Schema createProperty31() { - return new JsonSchema(); + return new JsonSchema().typesItem("object").type("object"); } }; From a2ab14754ba691cf910dba3184ed14c6ed1a8d19 Mon Sep 17 00:00:00 2001 From: Kevin Date: Fri, 26 Sep 2025 14:34:25 -0400 Subject: [PATCH 20/31] fix: fix existing test cases --- .../resolving/v31/ModelResolverOAS31Test.java | 4 +++- .../java/io/swagger/v3/jaxrs2/ReaderTest.java | 6 ++++++ .../test/resources/petstore/WebHookResource.yaml | 8 ++++++-- .../callbacks/ComplexCallback31Resource.yaml | 8 ++++++-- .../parameters/Parameters31Resource.yaml | 4 +++- .../requestbody/RequestBody31Resource.yaml | 16 ++++++++++++---- 6 files changed, 36 insertions(+), 10 deletions(-) diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/v31/ModelResolverOAS31Test.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/v31/ModelResolverOAS31Test.java index 13b3d16213..0906332ee6 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/v31/ModelResolverOAS31Test.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/v31/ModelResolverOAS31Test.java @@ -131,6 +131,7 @@ public void testOAS31Fields() { " type: number\n" + " status:\n" + " type:\n" + + " - object\n" + " - string\n" + " - number\n" + " intValue:\n" + @@ -160,7 +161,8 @@ public void testOAS31Fields() { " creditCard:\n" + " $ref: \"#/components/schemas/CreditCard\"\n" + " properties:\n" + - " extraObject: {}\n" + + " extraObject: \n" + + " type: object\n" + "MultipleBaseBean:\n" + " type: object\n" + " description: MultipleBaseBean\n" + diff --git a/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/ReaderTest.java b/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/ReaderTest.java index 7d2eea8c2b..acf3259f66 100644 --- a/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/ReaderTest.java +++ b/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/ReaderTest.java @@ -3569,6 +3569,7 @@ public void testOas31Petstore() { " name:\n" + " type: string\n" + " annotated:\n" + + " type: object\n" + " $ref: \"#/components/schemas/Category\"\n" + " description: child description\n" + " properties:\n" + @@ -3623,6 +3624,7 @@ public void test31RefSiblings() { " type: object\n" + " properties:\n" + " annotated:\n" + + " type: \"object\"\n" + " $ref: \"#/components/schemas/SimpleCategory\"\n" + " description: child description\n" + " properties:\n" + @@ -4006,6 +4008,7 @@ public void testMisc31() { " type: number\n" + " status:\n" + " type:\n" + + " - object\n" + " - string\n" + " - number\n" + " intValue:\n" + @@ -4085,6 +4088,7 @@ public void testMisc31() { " type: object\n" + " properties:\n" + " country:\n" + + " type: object\n" + " const: United States\n" + " CreditCard:\n" + " type: object\n" + @@ -4095,11 +4099,13 @@ public void testMisc31() { " type: object\n" + " properties:\n" + " postalCode:\n" + + " type: object\n" + " pattern: \"[0-9]{5}(-[0-9]{4})?\"\n" + " PostalCodePattern:\n" + " type: object\n" + " properties:\n" + " postalCode:\n" + + " type: object\n" + " pattern: \"[A-Z][0-9][A-Z] [0-9][A-Z][0-9]\"\n" + " PropertyNamesPattern:\n" + " pattern: \"^[A-Za-z_][A-Za-z0-9_]*$\"\n"; diff --git a/modules/swagger-jaxrs2/src/test/resources/petstore/WebHookResource.yaml b/modules/swagger-jaxrs2/src/test/resources/petstore/WebHookResource.yaml index 62e397cade..c1376f1ae2 100644 --- a/modules/swagger-jaxrs2/src/test/resources/petstore/WebHookResource.yaml +++ b/modules/swagger-jaxrs2/src/test/resources/petstore/WebHookResource.yaml @@ -24,9 +24,13 @@ webhooks: $comment: random comment $id: http://yourdomain.com/schemas/myschema.json dependentSchemas: - pet: {} + pet: { + type: object + } patternProperties: - user: {} + user: { + type: object + } webhook1: post: description: "subscribes a client to updates relevant to the requestor's account,\ diff --git a/modules/swagger-jaxrs2/src/test/resources/petstore/callbacks/ComplexCallback31Resource.yaml b/modules/swagger-jaxrs2/src/test/resources/petstore/callbacks/ComplexCallback31Resource.yaml index 79189d9464..9195e13b7b 100644 --- a/modules/swagger-jaxrs2/src/test/resources/petstore/callbacks/ComplexCallback31Resource.yaml +++ b/modules/swagger-jaxrs2/src/test/resources/petstore/callbacks/ComplexCallback31Resource.yaml @@ -32,9 +32,13 @@ paths: $comment: random comment $id: http://yourdomain.com/schemas/myschema.json dependentSchemas: - pet: { } + pet: { + type: object + } patternProperties: - user: { } + user: { + type: object + } testCallback2: http://www.url2.com: get: diff --git a/modules/swagger-jaxrs2/src/test/resources/petstore/parameters/Parameters31Resource.yaml b/modules/swagger-jaxrs2/src/test/resources/petstore/parameters/Parameters31Resource.yaml index e42efe9760..b6c10e120c 100644 --- a/modules/swagger-jaxrs2/src/test/resources/petstore/parameters/Parameters31Resource.yaml +++ b/modules/swagger-jaxrs2/src/test/resources/petstore/parameters/Parameters31Resource.yaml @@ -96,7 +96,9 @@ paths: user: $ref: "#/components/schemas/User" properties: - extraObject: {} + extraObject: { + type: object + } components: schemas: Category: diff --git a/modules/swagger-jaxrs2/src/test/resources/petstore/requestbody/RequestBody31Resource.yaml b/modules/swagger-jaxrs2/src/test/resources/petstore/requestbody/RequestBody31Resource.yaml index 2c5b00cc76..24f6143ae8 100644 --- a/modules/swagger-jaxrs2/src/test/resources/petstore/requestbody/RequestBody31Resource.yaml +++ b/modules/swagger-jaxrs2/src/test/resources/petstore/requestbody/RequestBody31Resource.yaml @@ -40,16 +40,24 @@ paths: - string - number - object - if: {} - then: {} - else: {} + if: { + type: object + } + then: { + type: object + } + else: { + type: object + } $anchor: parameter $anchor $schema: parameter $schema description: User description example: User Description exclusiveMaximum: 100 exclusiveMinimum: 1 - unevaluatedProperties: {} + unevaluatedProperties: { + type: object + } required: true responses: default: From fd8ad9fe4f09fc2522eb3eff74d2a478f4d1deae Mon Sep 17 00:00:00 2001 From: K5qu4r3d Date: Tue, 30 Sep 2025 11:07:18 -0400 Subject: [PATCH 21/31] fix: fix existing test cases pt. 2 --- .../swagger/v3/java17/resolving/v31/ModelResolverOAS31Test.java | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/swagger-java17-support/src/test/java/io/swagger/v3/java17/resolving/v31/ModelResolverOAS31Test.java b/modules/swagger-java17-support/src/test/java/io/swagger/v3/java17/resolving/v31/ModelResolverOAS31Test.java index 902f4336da..f16b986d93 100644 --- a/modules/swagger-java17-support/src/test/java/io/swagger/v3/java17/resolving/v31/ModelResolverOAS31Test.java +++ b/modules/swagger-java17-support/src/test/java/io/swagger/v3/java17/resolving/v31/ModelResolverOAS31Test.java @@ -37,6 +37,7 @@ public void testOAS31JavaRecord() { " type: number\n" + " Status:\n" + " type:\n" + + " - object\n" + " - string\n" + " - number\n"; From dfbbc62d23005c074afa6be3cf4eb2a42fdd1b76 Mon Sep 17 00:00:00 2001 From: K5qu4r3d Date: Tue, 30 Sep 2025 11:13:55 -0400 Subject: [PATCH 22/31] fix: update access modifier of class PrimitiveType.DateStub --- .../src/main/java/io/swagger/v3/core/util/PrimitiveType.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java index 24b996cb8c..05c9202b1f 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java @@ -572,7 +572,7 @@ private static void addMultiKeys(Map> map, Prim } } - private static class DateStub { + public static class DateStub { private DateStub() { } } From e5f73127fc3fc9412bc5c735eef1e83aea335f2b Mon Sep 17 00:00:00 2001 From: K5qu4r3d Date: Fri, 3 Oct 2025 10:40:10 -0400 Subject: [PATCH 23/31] test: add test cases for updated OpenAPI 3.1 "type"/"types" value schemas --- .../v3/jaxrs2/APIResponsesResourceTest.java | 171 +++++++++++++++ .../resources/APIResponsesResource.java | 200 ++++++++++++++++++ 2 files changed, 371 insertions(+) create mode 100644 modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/APIResponsesResourceTest.java create mode 100644 modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/resources/APIResponsesResource.java diff --git a/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/APIResponsesResourceTest.java b/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/APIResponsesResourceTest.java new file mode 100644 index 0000000000..8e46de0338 --- /dev/null +++ b/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/APIResponsesResourceTest.java @@ -0,0 +1,171 @@ +package io.swagger.v3.jaxrs2; + +import io.swagger.v3.jaxrs2.resources.APIResponsesResource; +import io.swagger.v3.oas.integration.SwaggerConfiguration; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.Operation; +import io.swagger.v3.oas.models.media.Schema; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import static org.testng.AssertJUnit.assertEquals; + +public class APIResponsesResourceTest { + private OpenAPI openAPI; + + @BeforeMethod + public void setUp() { + SwaggerConfiguration config = new SwaggerConfiguration().openAPI31(true); + Reader reader = new Reader(config); + openAPI = reader.read(APIResponsesResource.class); + } + + private Schema getResponseSchema(String path) { + Operation postOperation = openAPI.getPaths().get(path).getPost(); + return postOperation.getResponses().get("200").getContent().get("*/*").getSchema(); + } + + @Test + public void testStringOrEmailSchemaAPIResource31() { + Schema responseSchema = getResponseSchema("/postStringOrEmailSchemaContent"); + + // Value of field "type" must equal value of field "types" + assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); + } + + @Test + public void testBooleanSchemaAPIResource31() { + Schema responseSchema = getResponseSchema("/postBooleanSchemaContent"); + + // Value of field "type" must equal value of field "types" + assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); + } + + @Test + public void testByteOrBinarySchemaAPIResource31() { + Schema responseSchema = getResponseSchema("/postByteOrBinarySchemaContent"); + + // Value of field "type" must equal value of field "types" + assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); + } + + @Test + public void testURISchemaAPIResource31() { + Schema responseSchema = getResponseSchema("/postURISchemaContent"); + + // Value of field "type" must equal value of field "types" + assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); + } + + @Test + public void testURLSchemaAPIResource31() { + Schema responseSchema = getResponseSchema("/postURLSchemaContent"); + + // Value of field "type" must equal value of field "types" + assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); + } + + @Test + public void testUUIDSchemaAPIResource31() { + Schema responseSchema = getResponseSchema("/postUUIDSchemaContent"); + + // Value of field "type" must equal value of field "types" + assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); + } + + @Test + public void testIntegerSchemaAPIResource31() { + Schema responseSchema = getResponseSchema("/postIntegerSchemaContent"); + + // Value of field "type" must equal value of field "types" + assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); + } + + @Test + public void testLongSchemaAPIResource31() { + Schema responseSchema = getResponseSchema("/postLongSchemaContent"); + + // Value of field "type" must equal value of field "types" + assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); + } + + @Test + public void testFloatSchemaAPIResource31() { + Schema responseSchema = getResponseSchema("/postFloatSchemaContent"); + + // Value of field "type" must equal value of field "types" + assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); + } + + @Test + public void testDoubleSchemaAPIResource31() { + Schema responseSchema = getResponseSchema("/postDoubleSchemaContent"); + + // Value of field "type" must equal value of field "types" + assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); + } + + @Test + public void testBigIntegerSchemaAPIResource31() { + Schema responseSchema = getResponseSchema("/postBigIntegerSchemaContent"); + + // Value of field "type" must equal value of field "types" + assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); + } + + @Test + public void testBigDecimalSchemaAPIResource31() { + Schema responseSchema = getResponseSchema("/postBigDecimalSchemaContent"); + + // Value of field "type" must equal value of field "types" + assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); + } + + @Test + public void testNumberSchemaAPIResource31() { + Schema responseSchema = getResponseSchema("/postNumberSchemaContent"); + + // Value of field "type" must equal value of field "types" + assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); + } + + @Test + public void testDateStubSchemaAPIResource31() { + Schema responseSchema = getResponseSchema("/postDateStubSchemaContent"); + + // Value of field "type" must equal value of field "types" + assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); + } + + @Test + public void testDateSchemaAPIResource31() { + Schema responseSchema = getResponseSchema("/postDateSchemaContent"); + + // Value of field "type" must equal value of field "types" + assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); + } + + @Test + public void testLocalTimeSchemaAPIResource31() { + Schema responseSchema = getResponseSchema("/postLocalTimeSchemaContent"); + + // Value of field "type" must equal value of field "types" + assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); + } + + @Test + public void testFileSchemaAPIResource31() { + Schema responseSchema = getResponseSchema("/postFileSchemaContent"); + + // Value of field "type" must equal value of field "types" + assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); + } + + @Test + public void testObjectSchemaAPIResource31() { + Schema responseSchema = getResponseSchema("/postObjectSchemaContent"); + + // Value of field "type" must equal value of field "types" + assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); + } +} \ No newline at end of file diff --git a/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/resources/APIResponsesResource.java b/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/resources/APIResponsesResource.java new file mode 100644 index 0000000000..95d05aee99 --- /dev/null +++ b/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/resources/APIResponsesResource.java @@ -0,0 +1,200 @@ +package io.swagger.v3.jaxrs2.resources; + +import io.swagger.v3.core.util.PrimitiveType; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; + +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import java.io.File; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.net.URI; +import java.net.URL; +import java.time.LocalTime; +import java.util.Date; +import java.util.UUID; + +public class APIResponsesResource { + @POST + @Path("postStringOrEmailSchemaContent") + @ApiResponses({ + @ApiResponse( + responseCode = "200", + content = @Content(schema = @Schema(implementation = String.class)) + ) + }) + public void postStringOrEmailSchemaContent() { } + + @POST + @Path("postBooleanSchemaContent") + @ApiResponses({ + @ApiResponse( + responseCode = "200", + content = @Content(schema = @Schema(implementation = Boolean.class)) + ) + }) + public void postBooleanSchemaContent() { } + + @POST + @Path("postByteOrBinarySchemaContent") + @ApiResponses({ + @ApiResponse( + responseCode = "200", + content = @Content(schema = @Schema(implementation = Byte.class)) + ) + }) + public void postByteOrBinarySchemaContent() { } + + @POST + @Path("postURISchemaContent") + @ApiResponses({ + @ApiResponse( + responseCode = "200", + content = @Content(schema = @Schema(implementation = URI.class)) + ) + }) + public void postURISchemaContent() { } + + @POST + @Path("postURLSchemaContent") + @ApiResponses({ + @ApiResponse( + responseCode = "200", + content = @Content(schema = @Schema(implementation = URL.class)) + ) + }) + public void postURLSchemaContent() { } + + @POST + @Path("postUUIDSchemaContent") + @ApiResponses({ + @ApiResponse( + responseCode = "200", + content = @Content(schema = @Schema(implementation = UUID.class)) + ) + }) + public void postUUIDSchemaContent() { } + + @POST + @Path("postIntegerSchemaContent") + @ApiResponses({ + @ApiResponse( + responseCode = "200", + content = @Content(schema = @Schema(implementation = Integer.class)) + ) + }) + public void postIntegerSchemaContent() { } + + @POST + @Path("postLongSchemaContent") + @ApiResponses({ + @ApiResponse( + responseCode = "200", + content = @Content(schema = @Schema(implementation = Long.class)) + ) + }) + public void postLongSchemaContent() { } + + @POST + @Path("postFloatSchemaContent") + @ApiResponses({ + @ApiResponse( + responseCode = "200", + content = @Content(schema = @Schema(implementation = Float.class)) + ) + }) + public void postFloatSchemaContent() { } + + @POST + @Path("postDoubleSchemaContent") + @ApiResponses({ + @ApiResponse( + responseCode = "200", + content = @Content(schema = @Schema(implementation = Double.class)) + ) + }) + public void postDoubleSchemaContent() { } + + @POST + @Path("postBigIntegerSchemaContent") + @ApiResponses({ + @ApiResponse( + responseCode = "200", + content = @Content(schema = @Schema(implementation = BigInteger.class)) + ) + }) + public void postBigIntegerSchemaContent() { } + + @POST + @Path("postBigDecimalSchemaContent") + @ApiResponses({ + @ApiResponse( + responseCode = "200", + content = @Content(schema = @Schema(implementation = BigDecimal.class)) + ) + }) + public void postBigDecimalSchemaContent() { } + + @POST + @Path("postNumberSchemaContent") + @ApiResponses({ + @ApiResponse( + responseCode = "200", + content = @Content(schema = @Schema(implementation = Number.class)) + ) + }) + public void postNumberSchemaContent() { } + + @POST + @Path("postDateStubSchemaContent") + @ApiResponses({ + @ApiResponse( + responseCode = "200", + content = @Content(schema = @Schema(implementation = PrimitiveType.DateStub.class)) + ) + }) + public void postDateStubSchemaContent() { } + + @POST + @Path("postDateSchemaContent") + @ApiResponses({ + @ApiResponse( + responseCode = "200", + content = @Content(schema = @Schema(implementation = Date.class)) + ) + }) + public void postDateSchemaContent() { } + + @POST + @Path("postLocalTimeSchemaContent") + @ApiResponses({ + @ApiResponse( + responseCode = "200", + content = @Content(schema = @Schema(implementation = LocalTime.class)) + ) + }) + public void postLocalTimeSchemaContent() { } + + @POST + @Path("postFileSchemaContent") + @ApiResponses({ + @ApiResponse( + responseCode = "200", + content = @Content(schema = @Schema(implementation = File.class)) + ) + }) + public void postFileSchemaContent() { } + + @POST + @Path("postObjectSchemaContent") + @ApiResponses({ + @ApiResponse( + responseCode = "200", + content = @Content(schema = @Schema(implementation = Object.class)) + ) + }) + public void postObjectSchemaContent() { } +} From 1f1a35b5f00de461cb516b6abea9ea733db60ecc Mon Sep 17 00:00:00 2001 From: K5qu4r3d Date: Fri, 3 Oct 2025 10:41:49 -0400 Subject: [PATCH 24/31] fix: update type values for date/time 3.1 schemas --- .../main/java/io/swagger/v3/core/util/PrimitiveType.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java index 05c9202b1f..8960cb91db 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java @@ -198,7 +198,7 @@ public DateSchema createProperty() { } @Override public Schema createProperty31() { - return new JsonSchema().typesItem("string").type("string").format("date"); + return new JsonSchema().typesItem("object").type("object").format("date"); } }, DATE_TIME(java.util.Date.class, "date-time") { @@ -208,7 +208,7 @@ public DateTimeSchema createProperty() { } @Override public Schema createProperty31() { - return new JsonSchema().typesItem("string").type("string").format("date-time"); + return new JsonSchema().typesItem("object").type("object").format("date-time"); } }, PARTIAL_TIME(java.time.LocalTime.class, "partial-time") { @@ -218,7 +218,7 @@ public Schema createProperty() { } @Override public Schema createProperty31() { - return new JsonSchema().typesItem("string").type("string").format("partial-time"); + return new JsonSchema().typesItem("object").type("object").format("partial-time"); } }, FILE(java.io.File.class, "file") { @@ -337,6 +337,7 @@ public Schema createProperty31() { addKeys(keyClasses, NUMBER, Number.class); addKeys(keyClasses, DATE, DateStub.class); addKeys(keyClasses, DATE_TIME, java.util.Date.class); +// addKeys(keyClasses, PARTIAL_TIME, java.time.LocalTime.class); addKeys(keyClasses, FILE, java.io.File.class); addKeys(keyClasses, OBJECT, Object.class); KEY_CLASSES = Collections.unmodifiableMap(keyClasses); From a7242fe1b6015b9b2e8a92a3b3b2f2c9889e7171 Mon Sep 17 00:00:00 2001 From: K5qu4r3d Date: Tue, 7 Oct 2025 13:47:40 -0400 Subject: [PATCH 25/31] fix: add "LocalTime" class mappings for PARTIAL_TIME --- .../src/main/java/io/swagger/v3/core/util/PrimitiveType.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java index 8960cb91db..54581a910d 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java @@ -375,6 +375,9 @@ public Schema createProperty31() { addKeys(names, OBJECT, "object"); NAMES = Collections.unmodifiableMap(names); + // Add "LocalTime" class mappings + enablePartialTime(); + if (System.getenv(Schema.EXPLICIT_OBJECT_SCHEMA_PROPERTY) != null) { explicitObjectType = Boolean.parseBoolean(System.getenv(Schema.EXPLICIT_OBJECT_SCHEMA_PROPERTY)); } else if (System.getProperty(Schema.EXPLICIT_OBJECT_SCHEMA_PROPERTY) != null) { From 524b75d9c0377bb4914ba1f624894140bc3fe15c Mon Sep 17 00:00:00 2001 From: K5qu4r3d Date: Tue, 7 Oct 2025 13:50:02 -0400 Subject: [PATCH 26/31] fix: remove duplicate "LocalTime" model from expected YAML --- .../v3/core/resolving/Ticket2992Test.java | 42 ------------------- 1 file changed, 42 deletions(-) diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/Ticket2992Test.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/Ticket2992Test.java index 75eebf5df4..b1db707a72 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/Ticket2992Test.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/Ticket2992Test.java @@ -18,48 +18,6 @@ public void testLocalTime() throws Exception { ModelConverterContextImpl context = new ModelConverterContextImpl(modelResolver); - Schema model = context - .resolve(new AnnotatedType(TestObject2992.class)); - - SerializationMatchers.assertEqualsToYaml(context.getDefinedModels(), "LocalTime:\n" + - " type: object\n" + - " properties:\n" + - " hour:\n" + - " type: integer\n" + - " format: int32\n" + - " minute:\n" + - " type: integer\n" + - " format: int32\n" + - " second:\n" + - " type: integer\n" + - " format: int32\n" + - " nano:\n" + - " type: integer\n" + - " format: int32\n" + - "TestObject2992:\n" + - " type: object\n" + - " properties:\n" + - " name:\n" + - " type: string\n" + - " a:\n" + - " $ref: \"#/components/schemas/LocalTime\"\n" + - " b:\n" + - " $ref: \"#/components/schemas/LocalTime\"\n" + - " c:\n" + - " $ref: \"#/components/schemas/LocalTime\"\n" + - " d:\n" + - " type: string\n" + - " format: date-time\n" + - " e:\n" + - " type: string\n" + - " format: date-time\n" + - " f:\n" + - " type: string\n" + - " format: date-time"); - - PrimitiveType.enablePartialTime(); - context = new ModelConverterContextImpl(modelResolver); - context .resolve(new AnnotatedType(TestObject2992.class)); From 7f833df8988cc326ac024ad6fa5b01961b2f4362 Mon Sep 17 00:00:00 2001 From: Kevin Date: Wed, 8 Oct 2025 11:17:40 -0400 Subject: [PATCH 27/31] fix: convert APIResponsesResourceTest to parameterized test --- .../v3/jaxrs2/APIResponsesResourceTest.java | 168 +++--------------- 1 file changed, 29 insertions(+), 139 deletions(-) diff --git a/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/APIResponsesResourceTest.java b/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/APIResponsesResourceTest.java index 8e46de0338..2b0b2f5615 100644 --- a/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/APIResponsesResourceTest.java +++ b/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/APIResponsesResourceTest.java @@ -6,6 +6,7 @@ import io.swagger.v3.oas.models.Operation; import io.swagger.v3.oas.models.media.Schema; import org.testng.annotations.BeforeMethod; +import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import static org.testng.AssertJUnit.assertEquals; @@ -13,6 +14,31 @@ public class APIResponsesResourceTest { private OpenAPI openAPI; + // Prepare list of resource schema URLs + @DataProvider(name = "schemas") + public String[] getSchemas() { + return new String[] { + "/postStringOrEmailSchemaContent", + "/postBooleanSchemaContent", + "/postByteOrBinarySchemaContent", + "/postURISchemaContent", + "/postURLSchemaContent", + "/postUUIDSchemaContent", + "/postIntegerSchemaContent", + "/postLongSchemaContent", + "/postFloatSchemaContent", + "/postDoubleSchemaContent", + "/postBigIntegerSchemaContent", + "/postBigDecimalSchemaContent", + "/postNumberSchemaContent", + "/postDateStubSchemaContent", + "/postDateSchemaContent", + "/postLocalTimeSchemaContent", + "/postFileSchemaContent", + "/postObjectSchemaContent" + }; + } + @BeforeMethod public void setUp() { SwaggerConfiguration config = new SwaggerConfiguration().openAPI31(true); @@ -25,145 +51,9 @@ private Schema getResponseSchema(String path) { return postOperation.getResponses().get("200").getContent().get("*/*").getSchema(); } - @Test - public void testStringOrEmailSchemaAPIResource31() { - Schema responseSchema = getResponseSchema("/postStringOrEmailSchemaContent"); - - // Value of field "type" must equal value of field "types" - assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); - } - - @Test - public void testBooleanSchemaAPIResource31() { - Schema responseSchema = getResponseSchema("/postBooleanSchemaContent"); - - // Value of field "type" must equal value of field "types" - assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); - } - - @Test - public void testByteOrBinarySchemaAPIResource31() { - Schema responseSchema = getResponseSchema("/postByteOrBinarySchemaContent"); - - // Value of field "type" must equal value of field "types" - assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); - } - - @Test - public void testURISchemaAPIResource31() { - Schema responseSchema = getResponseSchema("/postURISchemaContent"); - - // Value of field "type" must equal value of field "types" - assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); - } - - @Test - public void testURLSchemaAPIResource31() { - Schema responseSchema = getResponseSchema("/postURLSchemaContent"); - - // Value of field "type" must equal value of field "types" - assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); - } - - @Test - public void testUUIDSchemaAPIResource31() { - Schema responseSchema = getResponseSchema("/postUUIDSchemaContent"); - - // Value of field "type" must equal value of field "types" - assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); - } - - @Test - public void testIntegerSchemaAPIResource31() { - Schema responseSchema = getResponseSchema("/postIntegerSchemaContent"); - - // Value of field "type" must equal value of field "types" - assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); - } - - @Test - public void testLongSchemaAPIResource31() { - Schema responseSchema = getResponseSchema("/postLongSchemaContent"); - - // Value of field "type" must equal value of field "types" - assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); - } - - @Test - public void testFloatSchemaAPIResource31() { - Schema responseSchema = getResponseSchema("/postFloatSchemaContent"); - - // Value of field "type" must equal value of field "types" - assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); - } - - @Test - public void testDoubleSchemaAPIResource31() { - Schema responseSchema = getResponseSchema("/postDoubleSchemaContent"); - - // Value of field "type" must equal value of field "types" - assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); - } - - @Test - public void testBigIntegerSchemaAPIResource31() { - Schema responseSchema = getResponseSchema("/postBigIntegerSchemaContent"); - - // Value of field "type" must equal value of field "types" - assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); - } - - @Test - public void testBigDecimalSchemaAPIResource31() { - Schema responseSchema = getResponseSchema("/postBigDecimalSchemaContent"); - - // Value of field "type" must equal value of field "types" - assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); - } - - @Test - public void testNumberSchemaAPIResource31() { - Schema responseSchema = getResponseSchema("/postNumberSchemaContent"); - - // Value of field "type" must equal value of field "types" - assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); - } - - @Test - public void testDateStubSchemaAPIResource31() { - Schema responseSchema = getResponseSchema("/postDateStubSchemaContent"); - - // Value of field "type" must equal value of field "types" - assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); - } - - @Test - public void testDateSchemaAPIResource31() { - Schema responseSchema = getResponseSchema("/postDateSchemaContent"); - - // Value of field "type" must equal value of field "types" - assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); - } - - @Test - public void testLocalTimeSchemaAPIResource31() { - Schema responseSchema = getResponseSchema("/postLocalTimeSchemaContent"); - - // Value of field "type" must equal value of field "types" - assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); - } - - @Test - public void testFileSchemaAPIResource31() { - Schema responseSchema = getResponseSchema("/postFileSchemaContent"); - - // Value of field "type" must equal value of field "types" - assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); - } - - @Test - public void testObjectSchemaAPIResource31() { - Schema responseSchema = getResponseSchema("/postObjectSchemaContent"); + @Test(dataProvider = "schemas") + public void testSchemaAPIResource31(String schema) { + Schema responseSchema = getResponseSchema(schema); // Value of field "type" must equal value of field "types" assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); From 81ab38b2ffba6679e112b5161e469edecfcb5f55 Mon Sep 17 00:00:00 2001 From: Kevin Date: Mon, 3 Nov 2025 08:51:45 -0500 Subject: [PATCH 28/31] fix: remove unnecessary comment --- .../src/main/java/io/swagger/v3/core/util/PrimitiveType.java | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java index 54581a910d..3b7e2fe825 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java @@ -337,7 +337,6 @@ public Schema createProperty31() { addKeys(keyClasses, NUMBER, Number.class); addKeys(keyClasses, DATE, DateStub.class); addKeys(keyClasses, DATE_TIME, java.util.Date.class); -// addKeys(keyClasses, PARTIAL_TIME, java.time.LocalTime.class); addKeys(keyClasses, FILE, java.io.File.class); addKeys(keyClasses, OBJECT, Object.class); KEY_CLASSES = Collections.unmodifiableMap(keyClasses); From d09b729fa92863f50ae466972fb649a79d1e717f Mon Sep 17 00:00:00 2001 From: Kevin Date: Mon, 3 Nov 2025 08:52:09 -0500 Subject: [PATCH 29/31] fix: remove enablePartialTime() call --- .../src/main/java/io/swagger/v3/core/util/PrimitiveType.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java index 3b7e2fe825..3948af72c3 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java @@ -374,9 +374,6 @@ public Schema createProperty31() { addKeys(names, OBJECT, "object"); NAMES = Collections.unmodifiableMap(names); - // Add "LocalTime" class mappings - enablePartialTime(); - if (System.getenv(Schema.EXPLICIT_OBJECT_SCHEMA_PROPERTY) != null) { explicitObjectType = Boolean.parseBoolean(System.getenv(Schema.EXPLICIT_OBJECT_SCHEMA_PROPERTY)); } else if (System.getProperty(Schema.EXPLICIT_OBJECT_SCHEMA_PROPERTY) != null) { From 47009dd609bfd1e38fa4fed9ed7116e0df13f45f Mon Sep 17 00:00:00 2001 From: Kevin Date: Mon, 3 Nov 2025 09:02:23 -0500 Subject: [PATCH 30/31] fix: rename variable for clarity --- .../main/java/io/swagger/v3/core/util/AnnotationsUtils.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/AnnotationsUtils.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/AnnotationsUtils.java index 6177f75078..cc101d4659 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/AnnotationsUtils.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/AnnotationsUtils.java @@ -951,10 +951,10 @@ public static Schema resolveSchemaFromType(Class schemaImplementation, Compon existingSchemaObject = reResolvedSchema.get(); } } - boolean doesSchemaHaveTypes = existingSchemaObject.getTypes() == null || existingSchemaObject.getTypes().isEmpty(); + boolean doesSchemaHaveNullOrEmptyTypes = existingSchemaObject.getTypes() == null || existingSchemaObject.getTypes().isEmpty(); if (StringUtils.isBlank(existingSchemaObject.get$ref()) && StringUtils.isBlank(existingSchemaObject.getType()) - && doesSchemaHaveTypes) { + && doesSchemaHaveNullOrEmptyTypes) { // default to string existingSchemaObject.setType("string"); } From 09b194a8c0f64857ca6def956f2ca448ab6fad91 Mon Sep 17 00:00:00 2001 From: Kevin Date: Fri, 14 Nov 2025 11:51:05 -0500 Subject: [PATCH 31/31] test: update APIResponsesResourceTest to cover for null type --- .../java/io/swagger/v3/jaxrs2/APIResponsesResourceTest.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/APIResponsesResourceTest.java b/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/APIResponsesResourceTest.java index 2b0b2f5615..1e97ab5dac 100644 --- a/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/APIResponsesResourceTest.java +++ b/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/APIResponsesResourceTest.java @@ -55,7 +55,10 @@ private Schema getResponseSchema(String path) { public void testSchemaAPIResource31(String schema) { Schema responseSchema = getResponseSchema(schema); + String fromGetType = responseSchema.getType() == null ? "null" : responseSchema.getType(); + String fromGetTypes = responseSchema.getTypes() == null ? "null" : responseSchema.getTypes().iterator().next().toString(); + // Value of field "type" must equal value of field "types" - assertEquals(responseSchema.getType(), responseSchema.getTypes().iterator().next()); + assertEquals(fromGetType, fromGetTypes); } } \ No newline at end of file