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 c153ed99da0bf7f68d7ed9a1c6044493071adc3d..3f6fc5ce2317ab6e41b9cab51cede1fc7048a9a3 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 @@ -2041,10 +2041,12 @@ public class DefaultCodegen implements CodegenConfig { property.allowableValues = allowableValues; } } + + Schema referencedSchema = ModelUtils.getReferencedSchema(this.openAPI, p); + //Referenced enum case: - Schema r = ModelUtils.getReferencedSchema(this.openAPI, p); - if (r.getEnum() != null && !r.getEnum().isEmpty()) { - List<Object> _enum = r.getEnum(); + if (referencedSchema.getEnum() != null && !referencedSchema.getEnum().isEmpty()) { + List<Object> _enum = referencedSchema.getEnum(); Map<String, Object> allowableValues = new HashMap<String, Object>(); allowableValues.put("values", _enum); @@ -2053,6 +2055,10 @@ public class DefaultCodegen implements CodegenConfig { } } + if (referencedSchema.getNullable() != null) { + property.isNullable = referencedSchema.getNullable(); + } + property.dataType = getTypeDeclaration(p); property.dataFormat = p.getFormat(); property.baseType = getSchemaType(p); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/InlineModelResolver.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/InlineModelResolver.java index cba9be057fbe6b95c435531be842d5ae66820249..63d937e2d1bc767fdc7e43b0eed65445a9730e55 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/InlineModelResolver.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/InlineModelResolver.java @@ -531,6 +531,7 @@ public class InlineModelResolver { model.setName(object.getName()); model.setXml(xml); model.setRequired(object.getRequired()); + model.setNullable(object.getNullable()); if (properties != null) { flattenProperties(properties, path); model.setProperties(properties); diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java index 348c41b1f83053be30b27f2537d4b9eb1e22a4ac..3a7825c1d83407d8bfceddcec4e9ac5cbe6a2c10 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java @@ -551,6 +551,18 @@ public class DefaultCodegenTest { Assert.assertTrue(cr.hasHeaders); } + @Test + public void testNullableProperty() { + final OpenAPI openAPI = TestUtils.parseSpec("src/test/resources/3_0/examples.yaml"); + new InlineModelResolver().flatten(openAPI); + final DefaultCodegen codegen = new DefaultCodegen(); + codegen.setOpenAPI(openAPI); + + CodegenProperty property = codegen.fromProperty("address", (Schema) openAPI.getComponents().getSchemas().get("User").getProperties().get("address")); + + Assert.assertTrue(property.isNullable); + } + private void verifyPersonDiscriminator(CodegenDiscriminator discriminator) { CodegenDiscriminator test = new CodegenDiscriminator(); test.setPropertyName("DollarUnderscoretype"); diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/InlineModelResolverTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/InlineModelResolverTest.java index 4eb8c29c3b7ca81ae4b78d1a882166007de9bd87..92018e3f50cc34c60bc952b05abb993198089a46 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/InlineModelResolverTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/InlineModelResolverTest.java @@ -695,4 +695,28 @@ public class InlineModelResolverTest { assertTrue(ModelUtils.getReferencedSchema(openAPI, schema.getItems()) instanceof StringSchema); assertNull(ModelUtils.getReferencedSchema(openAPI, schema.getItems()).getExample()); } + + @Test + public void nullable() { + OpenAPI openAPI = TestUtils.parseSpec("src/test/resources/3_0/inline_model_resolver.yaml"); + new InlineModelResolver().flatten(openAPI); + + Schema nullablePropertyReference = (Schema) openAPI.getComponents().getSchemas().get("InlinePropertyIsNullable").getProperties().get("nullable_property"); + Schema nullablePropertySchema = ModelUtils.getReferencedSchema(openAPI, nullablePropertyReference); + assertTrue(nullablePropertySchema.getNullable()); + + + Schema nullableRequestBodyReference = (Schema) openAPI + .getPaths() + .get("/nullable_properties") + .getPost() + .getRequestBody() + .getContent() + .get("application/json") + .getSchema() + .getProperties() + .get("nullable_request_body_property"); + Schema nullableRequestBodySchema = ModelUtils.getReferencedSchema(openAPI, nullableRequestBodyReference); + assertTrue(nullableRequestBodySchema.getNullable()); + } } \ No newline at end of file diff --git a/modules/openapi-generator/src/test/resources/3_0/examples.yaml b/modules/openapi-generator/src/test/resources/3_0/examples.yaml index 92f6d7b46de4fcf93f551eed50ece9eac607ade7..30c540919b123f4a8e7b6503efa1c0e444d36b85 100644 --- a/modules/openapi-generator/src/test/resources/3_0/examples.yaml +++ b/modules/openapi-generator/src/test/resources/3_0/examples.yaml @@ -107,4 +107,14 @@ paths: responses: '200': description: successful operation - +components: + schemas: + User: + type: object + properties: + address: + type: object + nullable: true + properties: + city: + type: string diff --git a/modules/openapi-generator/src/test/resources/3_0/inline_model_resolver.yaml b/modules/openapi-generator/src/test/resources/3_0/inline_model_resolver.yaml index 9da6749774ef15c503cb0bf341941195e1f515fb..a6235c7e60ecede1268090b7917a5dac6bf20484 100644 --- a/modules/openapi-generator/src/test/resources/3_0/inline_model_resolver.yaml +++ b/modules/openapi-generator/src/test/resources/3_0/inline_model_resolver.yaml @@ -266,6 +266,24 @@ paths: type: array items: $ref: '#/components/schemas/EmptyExampleOnStringTypeModels' + /nullable_properties: + post: + requestBody: + content: + application/json: + schema: + type: object + properties: + nullable_request_body_property: + type: object + nullable: true + properties: + nullable_request_body_property_name: + type: string + operationId: arbitraryObjectRequestBodyProperty + responses: + '200': + description: OK components: schemas: Users: @@ -301,3 +319,12 @@ components: EmptyExampleOnStringTypeModels: type: string example: '' + InlinePropertyIsNullable: + type: object + properties: + nullable_property: + type: object + nullable: true + properties: + nullable_property_name: + type: string