From 1009ae51eaca1e1933fe2f587304489e00dd3f4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Rodr=C3=ADguez=20Mart=C3=ADn?= Date: Thu, 4 May 2023 12:53:56 +0200 Subject: [PATCH] Add property generateClientAsBean for config creation of ApiClient.java and XXXApi.java --- docs/generators/java.md | 1 + .../codegen/languages/JavaClientCodegen.java | 11 ++++ .../libraries/resttemplate/ApiClient.mustache | 6 ++ .../Java/libraries/resttemplate/api.mustache | 6 ++ .../codegen/java/JavaClientCodegenTest.java | 62 +++++++++++++++++++ 5 files changed, 86 insertions(+) diff --git a/docs/generators/java.md b/docs/generators/java.md index b140c45e2891..075641f54e66 100644 --- a/docs/generators/java.md +++ b/docs/generators/java.md @@ -49,6 +49,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl |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.|
**false**
No changes to the enum's are made, this is the default option.
**true**
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.
|false| |errorObjectType|Error Object type. (This option is for okhttp-gson-next-gen only)| |null| |fullJavaUtil|whether to use fully qualified name for classes under java.util. This option only works for Java API client| |false| +|generateClientAsBean|For restTemplate, configure whether to create `ApiClient.java` and Apis clients as bean (with `@Component` annotation) |
**false**
No changes to the `ApiClient.java` or Apis are made, this is the default option.
**true**
With this option enabled, create `ApiClient.java` and Apis clients as bean.
| false | |gradleProperties|Append additional Gradle properties to the gradle.properties file| |null| |groupId|groupId in generated pom.xml| |org.openapitools| |hideGenerationTimestamp|Hides the generation timestamp when files are generated.| |false| diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaClientCodegen.java index eb831dfa544d..a1b6d5dd7b96 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaClientCodegen.java @@ -99,6 +99,8 @@ public class JavaClientCodegen extends AbstractJavaCodegen public static final String SERIALIZATION_LIBRARY_JACKSON = "jackson"; public static final String SERIALIZATION_LIBRARY_JSONB = "jsonb"; + public static final String GENERATE_CLIENT_AS_BEAN = "generateClientAsBean"; + protected String gradleWrapperPackage = "gradle.wrapper"; protected boolean useRxJava = false; protected boolean useRxJava2 = false; @@ -132,6 +134,7 @@ public class JavaClientCodegen extends AbstractJavaCodegen protected Map mpRestClientVersions = new HashMap<>(); protected boolean useSingleRequestParameter = false; protected boolean webclientBlockingOperations = false; + protected boolean generateClientAsBean = false; private static class MpRestClientVersion { public final String rootPackage; @@ -445,6 +448,10 @@ public void processOpts() { additionalProperties.put(SUPPORT_URL_QUERY, Boolean.parseBoolean(additionalProperties.get(SUPPORT_URL_QUERY).toString())); } + if (additionalProperties.containsKey(GENERATE_CLIENT_AS_BEAN)) { + this.setGenerateClientAsBean(convertPropertyToBooleanAndWriteBack(GENERATE_CLIENT_AS_BEAN)); + } + final String invokerFolder = (sourceFolder + '/' + invokerPackage).replace(".", "/"); final String apiFolder = (sourceFolder + '/' + apiPackage).replace(".", "/"); final String modelsFolder = (sourceFolder + File.separator + modelPackage().replace('.', File.separatorChar)).replace('/', File.separatorChar); @@ -1195,6 +1202,10 @@ public void setErrorObjectType(final String errorObjectType) { this.errorObjectType = errorObjectType; } + public void setGenerateClientAsBean(boolean generateClientAsBean) { + this.generateClientAsBean = generateClientAsBean; + } + /** * Serialization library. * diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/resttemplate/ApiClient.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/resttemplate/ApiClient.mustache index a844c8c384fa..14ba67fda663 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/resttemplate/ApiClient.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/resttemplate/ApiClient.mustache @@ -81,6 +81,9 @@ import {{invokerPackage}}.auth.OAuth; {{/hasOAuthMethods}} {{>generatedAnnotation}} +{{#generateClientAsBean}} +@Component("{{invokerPackage}}.ApiClient") +{{/generateClientAsBean}} public class ApiClient{{#jsr310}} extends JavaTimeFormatter{{/jsr310}} { public enum CollectionFormat { CSV(","), TSV("\t"), SSV(" "), PIPES("|"), MULTI(null); @@ -114,6 +117,9 @@ public class ApiClient{{#jsr310}} extends JavaTimeFormatter{{/jsr310}} { init(); } + {{#generateClientAsBean}} + @Autowired + {{/generateClientAsBean}} public ApiClient(RestTemplate restTemplate) { this.restTemplate = restTemplate; init(); diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/resttemplate/api.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/resttemplate/api.mustache index 87da6cf0402f..ff79da61e663 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/resttemplate/api.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/resttemplate/api.mustache @@ -27,6 +27,9 @@ import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; {{>generatedAnnotation}} +{{#generateClientAsBean}} +@Component("{{package}}.{{classname}}") +{{/generateClientAsBean}} {{#operations}} public class {{classname}} { private ApiClient apiClient; @@ -35,6 +38,9 @@ public class {{classname}} { this(new ApiClient()); } + {{#generateClientAsBean}} + @Autowired + {{/generateClientAsBean}} public {{classname}}(ApiClient apiClient) { this.apiClient = apiClient; } diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java index 2aec595e448e..1edd668490c8 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java @@ -2019,4 +2019,66 @@ public void testDeprecatedProperty() throws Exception { output.deleteOnExit(); } + @Test + public void testRestTemplateWithGeneratedClientAsBeanDisabled() throws IOException { + + Map properties = new HashMap<>(); + properties.put(CodegenConstants.API_PACKAGE, "xyz.abcdef.api"); + properties.put(JavaClientCodegen.GENERATE_CLIENT_AS_BEAN, false); + + File output = Files.createTempDirectory("test").toFile(); + output.deleteOnExit(); + + final CodegenConfigurator configurator = new CodegenConfigurator() + .setGeneratorName("java") + .setLibrary(JavaClientCodegen.RESTTEMPLATE) + .setAdditionalProperties(properties) + .setInputSpec("src/test/resources/3_0/petstore.yaml") + .setOutputDir(output.getAbsolutePath().replace("\\", "/")); + + + DefaultGenerator generator = new DefaultGenerator(); + List files = generator.opts(configurator.toClientOptInput()).generate(); + files.forEach(File::deleteOnExit); + + validateJavaSourceFiles(files); + + Path apiClient = Paths.get(output + "/src/main/java/xyz/abcdef/ApiClient.java"); + TestUtils.assertFileNotContains(apiClient, "@Component"); + + Path petApi = Paths.get(output + "/src/main/java/xyz/abcdef/api/PetApi.java"); + TestUtils.assertFileNotContains(petApi, "@Component"); + } + + @Test + public void testRestTemplateWithGeneratedClientAsBeanEnabled() throws IOException { + + Map properties = new HashMap<>(); + properties.put(CodegenConstants.API_PACKAGE, "xyz.abcdef.api"); + properties.put(JavaClientCodegen.GENERATE_CLIENT_AS_BEAN, true); + + File output = Files.createTempDirectory("test").toFile(); + output.deleteOnExit(); + + final CodegenConfigurator configurator = new CodegenConfigurator() + .setGeneratorName("java") + .setLibrary(JavaClientCodegen.RESTTEMPLATE) + .setAdditionalProperties(properties) + .setInputSpec("src/test/resources/3_0/petstore.yaml") + .setOutputDir(output.getAbsolutePath().replace("\\", "/")); + + + DefaultGenerator generator = new DefaultGenerator(); + List files = generator.opts(configurator.toClientOptInput()).generate(); + files.forEach(File::deleteOnExit); + + validateJavaSourceFiles(files); + + Path apiClient = Paths.get(output + "/src/main/java/xyz/abcdef/ApiClient.java"); + TestUtils.assertFileContains(apiClient, "@Component"); + + Path petApi = Paths.get(output + "/src/main/java/xyz/abcdef/api/PetApi.java"); + TestUtils.assertFileContains(petApi, "@Component"); + } + }