diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java index fcdd9df869bc..241b3f881ef0 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java @@ -2924,7 +2924,7 @@ protected void updateModelForComposedSchema(CodegenModel m, Schema schema, Map imports) codegenParameter.setTypeProperties(parameterSchema, openAPI); codegenParameter.setComposedSchemas(getComposedSchemas(parameterSchema)); - if (Boolean.TRUE.equals(parameterSchema.getNullable())) { // use nullable defined in the spec + if (ModelUtils.isNullable(parameterSchema)) { // use nullable defined in the spec codegenParameter.isNullable = true; } @@ -8066,7 +8054,9 @@ public CodegenParameter fromRequestBody(RequestBody body, Set imports, S if (original.getNullable() != null) { codegenParameter.isNullable = original.getNullable(); } else if (original.getExtensions() != null && original.getExtensions().containsKey(X_NULLABLE)) { - codegenParameter.isNullable = (Boolean) original.getExtensions().get(X_NULLABLE); + codegenParameter.isNullable = Boolean.parseBoolean(String.valueOf(original.getExtensions().get(X_NULLABLE))); + } else if (ModelUtils.isNullable(original)) { + codegenParameter.isNullable = true; } if (original.getExtensions() != null) { diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/OpenAPINormalizer.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/OpenAPINormalizer.java index 9a304b529503..d0b71a23d1c3 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/OpenAPINormalizer.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/OpenAPINormalizer.java @@ -998,8 +998,8 @@ public Schema normalizeSchema(Schema schema, Set visitedSchemas) { } normalizeProperties(schema, visitedSchemas); } else if (schema.getAdditionalProperties() instanceof Schema) { // map - normalizeMapSchema(schema); - Schema additionalProperties = (Schema) schema.getAdditionalProperties(); + Schema result = normalizeMapSchema(schema); + Schema additionalProperties = (Schema) result.getAdditionalProperties(); if (getRule(NORMALIZE_31SPEC) && ModelUtils.isNullTypeSchema(openAPI, additionalProperties)) { // OAS 3.1 allows a map value schema of `type: "null"` (e.g. // `additionalProperties: { type: "null" }`). There's no OAS 3.0 equivalent type, @@ -1008,15 +1008,17 @@ public Schema normalizeSchema(Schema schema, Set visitedSchemas) { // generated as a normal (nullable) object instead. Schema anyTypeNullable = new Schema(); anyTypeNullable.setNullable(true); - schema.setAdditionalProperties(anyTypeNullable); + result.setAdditionalProperties(anyTypeNullable); } else { Schema normalized = normalizeSchema(additionalProperties, visitedSchemas); if (getRule(NORMALIZE_31SPEC)) { // capture the normalized value schema (e.g. an OAS 3.1 `type: [array, "null"]` // value is rewritten to a proper array schema), which would otherwise be lost. - schema.setAdditionalProperties(normalized); + result.setAdditionalProperties(normalized); } } + + return result; } else if (schema instanceof BooleanSchema) { normalizeBooleanSchema(schema, visitedSchemas); } else if (schema instanceof IntegerSchema) { @@ -1105,7 +1107,8 @@ protected Schema normalizeArraySchema(Schema schema) { } protected Schema normalizeMapSchema(Schema schema) { - return processSetMapToNullable(schema); + Schema result = processNormalize31Spec(schema, new HashSet<>()); + return processSetMapToNullable(result); } protected Schema normalizeSimpleSchema(Schema schema, Set visitedSchemas) { diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/utils/ModelUtils.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/utils/ModelUtils.java index 01221e7cc26c..40058b1e90f2 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/utils/ModelUtils.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/utils/ModelUtils.java @@ -2001,9 +2001,7 @@ public static boolean isNullable(Schema schema) { if (schema.getExtensions() != null && schema.getExtensions().get(X_NULLABLE) != null) { return Boolean.parseBoolean(schema.getExtensions().get(X_NULLABLE).toString()); } - if (schema.getTypes() != null && schema.getTypes().contains("null")) { - return true; - } + // In OAS 3.1, the recommended way to define a nullable property or object is to use oneOf. if (isComposedSchema(schema)) { return isNullableComposedSchema(schema); diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/validations/oas/OpenApiSchemaValidationsTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/validations/oas/OpenApiSchemaValidationsTest.java index e71005f794c2..a48d714d88a5 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/validations/oas/OpenApiSchemaValidationsTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/validations/oas/OpenApiSchemaValidationsTest.java @@ -96,7 +96,7 @@ public void testNullableAttributeInOas31_triggerWarning() { /** * The nullable-deprecated warning must NOT fire for an OAS 3.1 spec using the correct 3.1 null type syntax. */ - @Test(enabled = false, description = "correct OAS 3.1 null type syntax (type: [string, null]) must NOT trigger the nullable-deprecated warning") + @Test(description = "correct OAS 3.1 null type syntax (type: [string, null]) must NOT trigger the nullable-deprecated warning") public void testNullTypeInOas31_noWarning() { OpenAPI openAPI = TestUtils.parseSpec("src/test/resources/3_1/null-types-simple.yaml"); Schema stringDataOrNull = (Schema) openAPI.getComponents().getSchemas().get("WithNullableType").getProperties().get("stringDataOrNull"); diff --git a/samples/client/petstore/java/okhttp-gson-3.1/api/openapi.yaml b/samples/client/petstore/java/okhttp-gson-3.1/api/openapi.yaml index 4348ded2a682..6c8d12078e36 100644 --- a/samples/client/petstore/java/okhttp-gson-3.1/api/openapi.yaml +++ b/samples/client/petstore/java/okhttp-gson-3.1/api/openapi.yaml @@ -325,6 +325,7 @@ paths: additionalProperties: format: int32 type: integer + type: object description: successful operation security: - api_key: []