From 1adabdcc7fe76b775c7b66b3850de748751c6202 Mon Sep 17 00:00:00 2001 From: Ben Schreiber Date: Tue, 22 Jul 2025 15:48:56 +0300 Subject: [PATCH] Keep nullability when inlining ref --- .../codegen/utils/ModelUtils.java | 6 ++++- .../codegen/utils/ModelUtilsTest.java | 25 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) 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 2c79c8a6ca83..87c8a9097335 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 @@ -1410,7 +1410,11 @@ public static Schema unaliasSchema(OpenAPI openAPI, schemaMappings); } } else { - return unaliasSchema(openAPI, allSchemas.get(ModelUtils.getSimpleRef(schema.get$ref())), schemaMappings); + Schema unaliased = unaliasSchema(openAPI, allSchemas.get(ModelUtils.getSimpleRef(schema.get$ref())), schemaMappings); + // Preserve nullable property from the original schema reference + Schema newSchema = cloneSchema(unaliased, false); + newSchema.setNullable(schema.getNullable()); + return newSchema; } } return schema; diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/utils/ModelUtilsTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/utils/ModelUtilsTest.java index a0b17a447885..621a95d9f952 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/utils/ModelUtilsTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/utils/ModelUtilsTest.java @@ -242,6 +242,31 @@ public void testAliasedTypeIsNotUnaliasedIfUsedForImportMapping() { Assert.assertEquals(stringSchema, ModelUtils.unaliasSchema(openAPI, emailSchema, new HashMap<>())); } + /** + * This test verifies that nullable property is preserved when unaliasing a schema reference. + * See https://github.com/OpenAPITools/openapi-generator/issues/21612 + */ + @Test + public void testNullableUnaliasedSchema() { + Schema refSchema = new Schema().$ref("#/components/schemas/MyString").nullable(true); + StringSchema myStringSchema = new StringSchema(); + OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("MyString", myStringSchema); + + Schema unaliased = ModelUtils.unaliasSchema(openAPI, refSchema, new HashMap<>()); + + Assert.assertTrue(unaliased.getNullable(), "Nullable property should be preserved after unaliasing"); + Assert.assertNotSame(unaliased, refSchema, "Unaliased schema should not be the same instance as the original reference"); + + Schema refSchema2 = new Schema().$ref("#/components/schemas/MyString"); + StringSchema myStringSchema2 = new StringSchema(); + OpenAPI openAPI2 = TestUtils.createOpenAPIWithOneSchema("MyString", myStringSchema2); + + Schema unaliased2 = ModelUtils.unaliasSchema(openAPI2, refSchema2, new HashMap<>()); + + Assert.assertNull(unaliased2.getNullable(), "Nullable property should be preserved after unaliasing"); + Assert.assertNotSame(unaliased2, refSchema2, "Unaliased schema should not be the same instance as the original reference"); + } + /** * Issue https://github.com/OpenAPITools/openapi-generator/issues/1624. * ModelUtils.isFreeFormObject() should not throw an NPE when passed an empty