Skip to content

Commit d284a9a

Browse files
authored
fix(spring): Add Nullable import for array-type models (#22788) (#22844)
* fix(spring): Add Nullable import for array-type models (#22788) * refactor(spring): Extract helper methods for Nullable import logic (DRY) * chore: Regenerate Spring samples after Nullable import fix * Update sample files after regeneration * Fix phpunit.xml.dist: replace literal backslashes with forward slashes in directory paths * Add JavaDoc comment for addSpringNullableImportForOperation method * Fix line endings: replace CRLF (\r\n) with LF (\n) in exampleJson string literals * Remove unused Nullable imports from PR-related Spring sample files * Revert date/time example value changes (regeneration artifacts) * Fix: Skip Nullable import for enum models
1 parent de3bbd5 commit d284a9a

2 files changed

Lines changed: 61 additions & 10 deletions

File tree

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SpringCodegen.java

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -968,11 +968,6 @@ public void postProcessModelProperty(CodegenModel model, CodegenProperty propert
968968
if (model.getVendorExtensions().containsKey("x-jackson-optional-nullable-helpers")) {
969969
model.imports.add("Arrays");
970970
}
971-
972-
// to prevent inheritors (JavaCamelServerCodegen etc.) mistakenly use it
973-
if (getName().contains("spring")) {
974-
model.imports.add("Nullable");
975-
}
976971
}
977972

978973
@Override
@@ -989,6 +984,11 @@ public CodegenModel fromModel(String name, Schema model) {
989984
codegenModel.imports.remove("Schema");
990985
}
991986

987+
// Only add Nullable import for non-enum models that may have nullable fields
988+
if (!Boolean.TRUE.equals(codegenModel.isEnum)) {
989+
addSpringNullableImport(codegenModel.imports);
990+
}
991+
992992
return codegenModel;
993993
}
994994

@@ -1052,11 +1052,7 @@ public CodegenOperation fromOperation(String path, String httpMethod, Operation
10521052
codegenOperation.imports.addAll(provideArgsClassSet);
10531053
}
10541054

1055-
// to prevent inheritors (JavaCamelServerCodegen etc.) mistakenly use it
1056-
if (getName().contains("spring")) {
1057-
codegenOperation.allParams.stream().filter(CodegenParameter::notRequiredOrIsNullable).findAny()
1058-
.ifPresent(p -> codegenOperation.imports.add("Nullable"));
1059-
}
1055+
addSpringNullableImportForOperation(codegenOperation);
10601056

10611057
if (reactive) {
10621058
if (DocumentationProvider.SPRINGFOX.equals(getDocumentationProvider())) {
@@ -1219,4 +1215,26 @@ public List<VendorExtension> getSupportedVendorExtensions() {
12191215
extensions.add(VendorExtension.X_SPRING_API_VERSION);
12201216
return extensions;
12211217
}
1218+
1219+
private boolean isSpringCodegen() {
1220+
return getName().contains("spring");
1221+
}
1222+
1223+
private void addSpringNullableImport(Set<String> imports) {
1224+
if (isSpringCodegen()) {
1225+
imports.add("Nullable");
1226+
}
1227+
}
1228+
1229+
/**
1230+
* Adds Spring Nullable import if any parameter is nullable or optional.
1231+
*/
1232+
private void addSpringNullableImportForOperation(CodegenOperation codegenOperation) {
1233+
if (isSpringCodegen()) {
1234+
codegenOperation.allParams.stream()
1235+
.filter(CodegenParameter::notRequiredOrIsNullable)
1236+
.findAny()
1237+
.ifPresent(param -> codegenOperation.imports.add("Nullable"));
1238+
}
1239+
}
12221240
}

modules/openapi-generator/src/test/java/org/openapitools/codegen/java/spring/SpringCodegenTest.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6223,4 +6223,37 @@ public void testExtensionsOnSchema_issue9183() throws IOException {
62236223
));
62246224
}
62256225

6226+
@Test
6227+
public void shouldAddNullableImportForArrayTypeModels() throws IOException {
6228+
File output = Files.createTempDirectory("test").toFile().getCanonicalFile();
6229+
output.deleteOnExit();
6230+
6231+
final OpenAPI openAPI = TestUtils.parseFlattenSpec(
6232+
"src/test/resources/3_0/spring/petstore-with-fake-endpoints-models-for-testing-with-spring-pageable.yaml");
6233+
final SpringCodegen codegen = new SpringCodegen();
6234+
codegen.setOpenAPI(openAPI);
6235+
codegen.setOutputDir(output.getAbsolutePath());
6236+
codegen.additionalProperties().put(INTERFACE_ONLY, "true");
6237+
codegen.additionalProperties().put(CodegenConstants.GENERATE_ALIAS_AS_MODEL, "true");
6238+
6239+
ClientOptInput input = new ClientOptInput();
6240+
input.openAPI(openAPI);
6241+
input.config(codegen);
6242+
6243+
DefaultGenerator generator = new DefaultGenerator();
6244+
generator.setGenerateMetadata(false);
6245+
generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "true");
6246+
generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false");
6247+
generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_DOCS, "false");
6248+
6249+
Map<String, File> files = generator.opts(input).generate().stream()
6250+
.collect(Collectors.toMap(File::getName, Function.identity()));
6251+
6252+
// AnimalFarm is an array-type model with no properties (issue #22788)
6253+
JavaFileAssert.assertThat(files.get("AnimalFarm.java"))
6254+
.hasImports("org.springframework.lang.Nullable");
6255+
JavaFileAssert.assertThat(files.get("Pet.java"))
6256+
.hasImports("org.springframework.lang.Nullable");
6257+
}
6258+
62266259
}

0 commit comments

Comments
 (0)