From b7857c145bf2fbf8b8321fed86a8d6bff0daa0b6 Mon Sep 17 00:00:00 2001 From: Sandro Kojan Date: Wed, 28 Jan 2026 15:33:40 +0100 Subject: [PATCH 1/4] [BUG][Java][Spring][SpringBoot] optional array with 'minItems': set generated list in models to uninitialized list --- .../languages/AbstractJavaCodegen.java | 4 +- .../java/spring/SpringCodegenTest.java | 30 ++++++++++++- .../src/test/resources/3_1/issue_22784.yaml | 45 +++++++++++++++++++ pom.xml | 2 +- 4 files changed, 77 insertions(+), 4 deletions(-) create mode 100644 modules/openapi-generator/src/test/resources/3_1/issue_22784.yaml 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 9a6d64f09c96..5d8afcd07e70 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 @@ -1326,8 +1326,8 @@ public String toDefaultValue(CodegenProperty cp, Schema schema) { // if default to empty container option is set, respect the default values provided in the spec return toArrayDefaultValue(cp, schema); } else if (schema.getDefault() == null) { - // nullable or containerDefaultToNull set to true - if (cp.isNullable || containerDefaultToNull) { + // nullable or containerDefaultToNull set to true or an optional array with minItems > 0 + if (cp.isNullable || containerDefaultToNull || (cp.minItems != null && cp.minItems > 0 && !cp.getHasRequired())) { return null; } return getDefaultCollectionType(schema); diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/spring/SpringCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/spring/SpringCodegenTest.java index 11ca74f3e534..39d573ea219b 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/spring/SpringCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/spring/SpringCodegenTest.java @@ -1590,7 +1590,6 @@ public void shouldGenerateDefaultValueForEnumRequestParameter() throws IOExcepti assertFileContains(Paths.get(outputPath + "/src/main/java/org/openapitools/api/GetApi.java"), "@RequestParam(value = \"testParameter1\", required = false, defaultValue = \"BAR\")", "@RequestParam(value = \"TestParameter2\", required = false, defaultValue = \"BAR\")"); - } /** @@ -5075,7 +5074,36 @@ public void optionalListShouldBeEmpty() throws IOException { JavaFileAssert.assertThat(files.get("PetDto.java")) .fileContains("private List<@Valid TagDto> tags = new ArrayList<>();") .fileContains("private List photoUrls = new ArrayList<>();"); + } + + @Test + public void testOptionalListWithMinItems1ShouldBeNull_issue_22784() throws IOException { + File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); + output.deleteOnExit(); + + OpenAPI openAPI = new OpenAPIParser() + .readLocation("src/test/resources/3_1/issue_22784.yaml", null, new ParseOptions()).getOpenAPI(); + SpringCodegen codegen = new SpringCodegen(); + codegen.setOutputDir(output.getAbsolutePath()); + codegen.additionalProperties().put(INTERFACE_ONLY, "true"); + codegen.additionalProperties().put(CodegenConstants.MODEL_PACKAGE, "xyz.model"); + codegen.additionalProperties().put(CodegenConstants.API_NAME_SUFFIX, "Controller"); + codegen.additionalProperties().put(CodegenConstants.API_PACKAGE, "xyz.controller"); + codegen.additionalProperties().put(CodegenConstants.MODEL_NAME_SUFFIX, "Dto"); + + ClientOptInput input = new ClientOptInput() + .openAPI(openAPI) + .config(codegen); + + DefaultGenerator generator = new DefaultGenerator(); + generator.setGenerateMetadata(false); // skip metadata and ↓ only generate models + generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "true"); + + Map files = generator.opts(input).generate().stream() + .collect(Collectors.toMap(File::getName, Function.identity())); + JavaFileAssert.assertThat(files.get("FooBarRequestDto.java")) + .fileContains("private @Nullable List<@Valid BarDto> barList;"); } @Test diff --git a/modules/openapi-generator/src/test/resources/3_1/issue_22784.yaml b/modules/openapi-generator/src/test/resources/3_1/issue_22784.yaml new file mode 100644 index 000000000000..046b4c314fbd --- /dev/null +++ b/modules/openapi-generator/src/test/resources/3_1/issue_22784.yaml @@ -0,0 +1,45 @@ +openapi: 3.1.1 +info: + title: Optional Array with minItems 1 OpenAPI Example + version: 1.0.0 +paths: + /foo-bar: + put: + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/FooBarRequest' + responses: + 204: + description: success + +components: + schemas: + FooBarRequest: + type: object + properties: + foo: + properties: + name: + type: string + required: + - name + barList: + description: | + This array is optional. If provided, it must contain between 1 and 3 items + type: array + items: + $ref: '#/components/schemas/Bar' + minItems: 1 + maxItems: 3 + required: + - foo + Bar: + type: object + properties: + someProperty: + type: string + required: + - someProperty diff --git a/pom.xml b/pom.xml index 2f5126f02691..fe684f30f7c8 100644 --- a/pom.xml +++ b/pom.xml @@ -1163,7 +1163,7 @@ modules/openapi-generator modules/openapi-generator-cli modules/openapi-generator-maven-plugin - modules/openapi-generator-gradle-plugin + modules/openapi-generator-mill-plugin modules/openapi-generator-online From 323b62bea90e5ae48b596395345b2f13079ed905 Mon Sep 17 00:00:00 2001 From: Sandro Kojan Date: Wed, 28 Jan 2026 15:47:23 +0100 Subject: [PATCH 2/4] [BUG][Java][Spring][SpringBoot] optional array with 'minItems': set generated list in models to uninitialized list --- .../main/java/org/openapitools/client/model/AnyTypeTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/client/petstore/java/okhttp-gson-3.1/src/main/java/org/openapitools/client/model/AnyTypeTest.java b/samples/client/petstore/java/okhttp-gson-3.1/src/main/java/org/openapitools/client/model/AnyTypeTest.java index ca471940b657..d024fba75c21 100644 --- a/samples/client/petstore/java/okhttp-gson-3.1/src/main/java/org/openapitools/client/model/AnyTypeTest.java +++ b/samples/client/petstore/java/okhttp-gson-3.1/src/main/java/org/openapitools/client/model/AnyTypeTest.java @@ -66,7 +66,7 @@ public class AnyTypeTest { public static final String SERIALIZED_NAME_REF_ARRAY_PREFIX_ITEMS = "ref_array_prefix_items"; @SerializedName(SERIALIZED_NAME_REF_ARRAY_PREFIX_ITEMS) @javax.annotation.Nullable - private List refArrayPrefixItems = new ArrayList<>(); + private List refArrayPrefixItems; public AnyTypeTest() { } From 56e3240141761e94963435eeca9ce5329614641f Mon Sep 17 00:00:00 2001 From: Sandro Kojan Date: Wed, 28 Jan 2026 16:58:57 +0100 Subject: [PATCH 3/4] [BUG][Java][Spring][SpringBoot] optional array with 'minItems': set generated list in models to uninitialized list --- pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/pom.xml b/pom.xml index fe684f30f7c8..df8a0027db37 100644 --- a/pom.xml +++ b/pom.xml @@ -1163,7 +1163,6 @@ modules/openapi-generator modules/openapi-generator-cli modules/openapi-generator-maven-plugin - modules/openapi-generator-mill-plugin modules/openapi-generator-online From 92c4bc0d44dd8ac4186bc4e5c63cc3c0d621acf3 Mon Sep 17 00:00:00 2001 From: Sandro Kojan Date: Wed, 28 Jan 2026 17:01:16 +0100 Subject: [PATCH 4/4] [BUG][Java][Spring][SpringBoot] optional array with 'minItems': set generated list in models to uninitialized list --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index df8a0027db37..2f5126f02691 100644 --- a/pom.xml +++ b/pom.xml @@ -1163,6 +1163,7 @@ modules/openapi-generator modules/openapi-generator-cli modules/openapi-generator-maven-plugin + modules/openapi-generator-gradle-plugin modules/openapi-generator-mill-plugin modules/openapi-generator-online