Skip to content

Commit 65773a9

Browse files
authored
[JavaSpring] Allow configuring generic ResponseEntity for Spring generator. (#21387)
* Allow configuring generic ResponseEntity for Spring generator. * Re-run documentation update script.
1 parent 311233d commit 65773a9

File tree

5 files changed

+52
-1
lines changed

5 files changed

+52
-1
lines changed

docs/generators/java-camel.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl
5858
|enumUnknownDefaultCase|If the server adds new enum cases, that are unknown by an old spec/client, the client will fail to parse the network response.With this option enabled, each enum will have a new case, 'unknown_default_open_api', so that when the server sends an enum case that is not known by the client/spec, they can safely fallback to this case.|<dl><dt>**false**</dt><dd>No changes to the enum's are made, this is the default option.</dd><dt>**true**</dt><dd>With this option enabled, each enum will have a new case, 'unknown_default_open_api', so that when the enum case sent by the server is not known by the client/spec, can safely be decoded to this case.</dd></dl>|false|
5959
|generateBuilders|Whether to generate builders for models| |false|
6060
|generateConstructorWithAllArgs|whether to generate a constructor for all arguments| |false|
61+
|generateGenericResponseEntity|Use a generic type for the `ResponseEntity` wrapping return values of generated API methods. If enabled, method are generated with return type ResponseEntity&lt;?&gt;| |false|
6162
|generatedConstructorWithRequiredArgs|Whether to generate constructors with required args for models| |true|
6263
|groupId|groupId in generated pom.xml| |org.openapitools|
6364
|hateoas|Use Spring HATEOAS library to allow adding HATEOAS links| |false|

docs/generators/spring.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl
5151
|enumUnknownDefaultCase|If the server adds new enum cases, that are unknown by an old spec/client, the client will fail to parse the network response.With this option enabled, each enum will have a new case, 'unknown_default_open_api', so that when the server sends an enum case that is not known by the client/spec, they can safely fallback to this case.|<dl><dt>**false**</dt><dd>No changes to the enum's are made, this is the default option.</dd><dt>**true**</dt><dd>With this option enabled, each enum will have a new case, 'unknown_default_open_api', so that when the enum case sent by the server is not known by the client/spec, can safely be decoded to this case.</dd></dl>|false|
5252
|generateBuilders|Whether to generate builders for models| |false|
5353
|generateConstructorWithAllArgs|whether to generate a constructor for all arguments| |false|
54+
|generateGenericResponseEntity|Use a generic type for the `ResponseEntity` wrapping return values of generated API methods. If enabled, method are generated with return type ResponseEntity&lt;?&gt;| |false|
5455
|generatedConstructorWithRequiredArgs|Whether to generate constructors with required args for models| |true|
5556
|groupId|groupId in generated pom.xml| |org.openapitools|
5657
|hateoas|Use Spring HATEOAS library to allow adding HATEOAS links| |false|

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ public class SpringCodegen extends AbstractJavaCodegen
9090
public static final String RETURN_SUCCESS_CODE = "returnSuccessCode";
9191
public static final String UNHANDLED_EXCEPTION_HANDLING = "unhandledException";
9292
public static final String USE_RESPONSE_ENTITY = "useResponseEntity";
93+
public static final String GENERATE_GENERIC_RESPONSE_ENTITY = "generateGenericResponseEntity";
9394
public static final String USE_ENUM_CASE_INSENSITIVE = "useEnumCaseInsensitive";
9495
public static final String USE_SPRING_BOOT3 = "useSpringBoot3";
9596
public static final String REQUEST_MAPPING_OPTION = "requestMappingMode";
@@ -147,6 +148,7 @@ public enum RequestMappingMode {
147148
@Setter protected boolean useSpringController = false;
148149
protected boolean useSwaggerUI = true;
149150
@Setter protected boolean useResponseEntity = true;
151+
@Setter protected boolean generateGenericResponseEntity = false;
150152
@Setter protected boolean useEnumCaseInsensitive = false;
151153
@Getter @Setter
152154
protected boolean useSpringBoot3 = false;
@@ -256,6 +258,10 @@ public SpringCodegen() {
256258
"Use the `ResponseEntity` type to wrap return values of generated API methods. "
257259
+ "If disabled, method are annotated using a `@ResponseStatus` annotation, which has the status of the first response declared in the Api definition",
258260
useResponseEntity));
261+
cliOptions.add(CliOption.newBoolean(GENERATE_GENERIC_RESPONSE_ENTITY,
262+
"Use a generic type for the `ResponseEntity` wrapping return values of generated API methods. "
263+
+ "If enabled, method are generated with return type ResponseEntity<?>",
264+
generateGenericResponseEntity));
259265
cliOptions.add(CliOption.newBoolean(USE_ENUM_CASE_INSENSITIVE,
260266
"Use `equalsIgnoreCase` when String for enum comparison",
261267
useEnumCaseInsensitive));
@@ -433,6 +439,11 @@ public void processOpts() {
433439

434440
convertPropertyToBooleanAndWriteBack(UNHANDLED_EXCEPTION_HANDLING, this::setUnhandledException);
435441
convertPropertyToBooleanAndWriteBack(USE_RESPONSE_ENTITY, this::setUseResponseEntity);
442+
convertPropertyToBooleanAndWriteBack(GENERATE_GENERIC_RESPONSE_ENTITY, this::setGenerateGenericResponseEntity);
443+
if (!useResponseEntity) {
444+
this.setGenerateGenericResponseEntity(false);
445+
this.additionalProperties.put(GENERATE_GENERIC_RESPONSE_ENTITY, false);
446+
}
436447
convertPropertyToBooleanAndWriteBack(OPTIONAL_ACCEPT_NULLABLE, this::setOptionalAcceptNullable);
437448
convertPropertyToBooleanAndWriteBack(USE_SPRING_BUILT_IN_VALIDATION, this::setUseSpringBuiltInValidation);
438449

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{{#isMap}}Map<String, {{{returnType}}}>{{/isMap}}{{#isArray}}{{#reactive}}{{{returnType}}}{{/reactive}}{{^reactive}}{{{returnContainer}}}<{{{returnType}}}>{{/reactive}}{{/isArray}}{{^returnContainer}}{{#useResponseEntity}}{{{returnType}}}{{/useResponseEntity}}{{^useResponseEntity}}{{#isDelegate}}{{#isVoid}}{{#responseWrapper}}{{{returnType}}}{{/responseWrapper}}{{^responseWrapper}}void{{/responseWrapper}}{{/isVoid}}{{^isVoid}}{{{returnType}}}{{/isVoid}}{{/isDelegate}}{{^isDelegate}}{{#async}}{{{returnType}}}{{/async}}{{^async}}{{#isVoid}}{{#responseWrapper}}{{{returnType}}}{{/responseWrapper}}{{^responseWrapper}}void{{/responseWrapper}}{{/isVoid}}{{^isVoid}}{{{returnType}}}{{/isVoid}}{{/async}}{{/isDelegate}}{{/useResponseEntity}}{{/returnContainer}}
1+
{{#isMap}}Map<String, {{{returnType}}}>{{/isMap}}{{#isArray}}{{#reactive}}{{{returnType}}}{{/reactive}}{{^reactive}}{{#generateGenericResponseEntity}}?{{/generateGenericResponseEntity}}{{^generateGenericResponseEntity}}{{{returnContainer}}}<{{{returnType}}}>{{/generateGenericResponseEntity}}{{/reactive}}{{/isArray}}{{^returnContainer}}{{#useResponseEntity}}{{#generateGenericResponseEntity}}?{{/generateGenericResponseEntity}}{{^generateGenericResponseEntity}}{{{returnType}}}{{/generateGenericResponseEntity}}{{/useResponseEntity}}{{^useResponseEntity}}{{#isDelegate}}{{#isVoid}}{{#responseWrapper}}{{{returnType}}}{{/responseWrapper}}{{^responseWrapper}}void{{/responseWrapper}}{{/isVoid}}{{^isVoid}}{{{returnType}}}{{/isVoid}}{{/isDelegate}}{{^isDelegate}}{{#async}}{{{returnType}}}{{/async}}{{^async}}{{#isVoid}}{{#responseWrapper}}{{{returnType}}}{{/responseWrapper}}{{^responseWrapper}}void{{/responseWrapper}}{{/isVoid}}{{^isVoid}}{{{returnType}}}{{/isVoid}}{{/async}}{{/isDelegate}}{{/useResponseEntity}}{{/returnContainer}}

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

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5532,4 +5532,42 @@ public void testCollectionTypesWithDefaults_issue_collection() throws IOExceptio
55325532
.fileContains("private @Nullable List<String> stringList;")
55335533
.fileContains("private List<String> stringRequiredList = new ArrayList<>();");
55345534
}
5535+
5536+
@Test
5537+
public void testGenericReturnTypeWhenUsingResponseEntity_issue1096() throws IOException {
5538+
Map<String, Object> additionalProperties = new HashMap<>();
5539+
additionalProperties.put(SpringCodegen.USE_RESPONSE_ENTITY, "true");
5540+
additionalProperties.put(SpringCodegen.GENERATE_GENERIC_RESPONSE_ENTITY, "true");
5541+
additionalProperties.put(SpringCodegen.USE_SPRING_BOOT3, "true");
5542+
additionalProperties.put(CodegenConstants.MODEL_TESTS, "false");
5543+
additionalProperties.put(CodegenConstants.MODEL_DOCS, "false");
5544+
additionalProperties.put(CodegenConstants.APIS, "true");
5545+
additionalProperties.put(CodegenConstants.SUPPORTING_FILES, "false");
5546+
5547+
Map<String, File> files = generateFromContract("src/test/resources/3_0/petstore.yaml", SPRING_BOOT, additionalProperties);
5548+
5549+
JavaFileAssert.assertThat(files.get("PetApi.java"))
5550+
.assertMethod("getPetById").hasReturnType("ResponseEntity<?>")
5551+
.toFileAssert()
5552+
.assertMethod("findPetsByStatus").hasReturnType("ResponseEntity<?>");
5553+
}
5554+
5555+
@Test
5556+
public void testGenericReturnTypeWhenNotUsingResponseEntity_issue1096() throws IOException {
5557+
Map<String, Object> additionalProperties = new HashMap<>();
5558+
additionalProperties.put(SpringCodegen.USE_RESPONSE_ENTITY, "false");
5559+
additionalProperties.put(SpringCodegen.GENERATE_GENERIC_RESPONSE_ENTITY, "true");
5560+
additionalProperties.put(SpringCodegen.USE_SPRING_BOOT3, "true");
5561+
additionalProperties.put(CodegenConstants.MODEL_TESTS, "false");
5562+
additionalProperties.put(CodegenConstants.MODEL_DOCS, "false");
5563+
additionalProperties.put(CodegenConstants.APIS, "true");
5564+
additionalProperties.put(CodegenConstants.SUPPORTING_FILES, "false");
5565+
5566+
Map<String, File> files = generateFromContract("src/test/resources/3_0/petstore.yaml", SPRING_BOOT, additionalProperties);
5567+
5568+
JavaFileAssert.assertThat(files.get("PetApi.java"))
5569+
.assertMethod("getPetById").hasReturnType("Pet")
5570+
.toFileAssert()
5571+
.assertMethod("findPetsByStatus").hasReturnType("List<Pet>");
5572+
}
55355573
}

0 commit comments

Comments
 (0)