From ccded6354a8b7b2a65a5a1f79a80d658323fe2d2 Mon Sep 17 00:00:00 2001 From: seonwoo_jung <79202163+seonwooj0810@users.noreply.github.com> Date: Wed, 22 Jul 2026 21:07:53 +0900 Subject: [PATCH] fix(java): render enum default on allOf + $ref composed property A property using the standard OAS 3.0 idiom of a $ref to an enum plus a sibling default (parsed as a composed allOf schema) no longer emitted the field initializer, so deserializing a payload without the property yielded null instead of the declared default. AbstractJavaCodegen.toDefaultValue's composed-schema branch (added in #23971 to render object defaults) returned null whenever getComposedSchemaProperties resolved no object properties, which is the case for a composition wrapping an enum or scalar. Restore the pre-#23971 behavior for that case by deferring to super.toDefaultValue, which emits the raw default for later enum var-name conversion. Fixes #24384 --- .../languages/AbstractJavaCodegen.java | 7 ++++++- .../codegen/java/AbstractJavaCodegenTest.java | 20 +++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java index 4959ada270af..8c83d7eb2e38 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java @@ -1516,7 +1516,12 @@ public String toDefaultValue(CodegenProperty cp, Schema schema) { if (!propertySchemas.isEmpty()) { return toObjectDefaultValue(cp, schema.getDefault(), propertySchemas); } - return null; + // No object properties resolved: the composition wraps a non-object, e.g. an `allOf` + // to an enum or scalar (`allOf: [{$ref: '#/.../CurrencyCode'}]` + sibling `default`). + // There is nothing to build via toObjectDefaultValue, so defer to the base behavior, + // which emits the raw default for later enum var-name / scalar conversion. Returning + // null here dropped the default and regressed enum defaults (see #24384). + return super.toDefaultValue(schema); } return null; } diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/AbstractJavaCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/AbstractJavaCodegenTest.java index b0f6c2b4f0f3..68066c848e5e 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/AbstractJavaCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/AbstractJavaCodegenTest.java @@ -650,6 +650,26 @@ public void toDefaultValueForComposedObjectWithDefaultTest() { Assert.assertEquals(rendered, "new " + cp.datatypeWithEnum + "().one(\"one\").two(\"two\")"); } + @Test + public void toDefaultValueForComposedEnumWithDefaultTest() { + // A `$ref` to an enum schema combined with a sibling `default` is parsed as a composed (allOf) + // schema that wraps a non-object, so getComposedSchemaProperties resolves no properties. The raw + // enum default must still be preserved (for later enum var-name conversion, e.g. `CurrencyCode.EUR`) + // rather than dropped to null, which regressed the standard `allOf` + sibling-`default` idiom (see #24384). + codegen.setDateLibrary("java8"); + codegen.setOpenAPI(new OpenAPI().components(new Components() + .addSchemas("CurrencyCode", new StringSchema()._enum(Arrays.asList("EUR", "USD"))))); + + Schema composed = new ComposedSchema() + .addAllOfItem(new Schema<>().$ref("#/components/schemas/CurrencyCode")); + composed.setDefault("EUR"); + + CodegenProperty cp = codegen.fromProperty("currency", composed); + String rendered = codegen.toDefaultValue(cp, composed); + + Assert.assertEquals(rendered, "EUR"); + } + @Test public void dateDefaultValueIsIsoDate() { final OpenAPI openAPI = FLATTENED_SPEC.get("3_0/spring/date-time-parameter-types-for-testing");