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"); } 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..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 @@ -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("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").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").format("partial-time"); + return new JsonSchema().typesItem("object").type("object").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"); } }; @@ -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); @@ -374,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) { @@ -572,7 +576,7 @@ private static void addMultiKeys(Map> map, Prim } } - private static class DateStub { + public static class DateStub { private DateStub() { } } 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)); 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-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"; 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..2b0b2f5615 --- /dev/null +++ b/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/APIResponsesResourceTest.java @@ -0,0 +1,61 @@ +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.DataProvider; +import org.testng.annotations.Test; + +import static org.testng.AssertJUnit.assertEquals; + +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); + 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(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()); + } +} \ No newline at end of file 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/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() { } +} 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: