Skip to content

Commit 785088d

Browse files
committed
feat(java client): Generalize generateClientAsBean (#19229)
Add usage of generateClientAsBean annotation in RestClient and Webclient templates and include it in documentation. Issue: #19229
1 parent 7d8eacc commit 785088d

File tree

7 files changed

+180
-89
lines changed

7 files changed

+180
-89
lines changed

docs/generators/java.md

+87-87
Large diffs are not rendered by default.

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ public JavaClientCodegen() {
239239
cliOptions.add(CliOption.newString(MICROPROFILE_REST_CLIENT_VERSION, "Version of MicroProfile Rest Client API."));
240240
cliOptions.add(CliOption.newBoolean(CodegenConstants.USE_SINGLE_REQUEST_PARAMETER, "Setting this property to true will generate functions with a single argument containing all API endpoint parameters instead of one argument per parameter. ONLY jersey2, jersey3, okhttp-gson, microprofile, Spring RestClient support this option."));
241241
cliOptions.add(CliOption.newBoolean(WEBCLIENT_BLOCKING_OPERATIONS, "Making all WebClient operations blocking(sync). Note that if on operation 'x-webclient-blocking: false' then such operation won't be sync", this.webclientBlockingOperations));
242-
cliOptions.add(CliOption.newBoolean(GENERATE_CLIENT_AS_BEAN, "For resttemplate, configure whether to create `ApiClient.java` and Apis clients as bean (with `@Component` annotation).", this.generateClientAsBean));
242+
cliOptions.add(CliOption.newBoolean(GENERATE_CLIENT_AS_BEAN, "For resttemplate, restclient and webclient, configure whether to create `ApiClient.java` and Apis clients as bean (with `@Component` annotation).", this.generateClientAsBean));
243243
cliOptions.add(CliOption.newBoolean(SUPPORT_URL_QUERY, "Generate toUrlQueryString in POJO (default to true). Available on `native`, `apache-httpclient` libraries."));
244244
cliOptions.add(CliOption.newBoolean(USE_ENUM_CASE_INSENSITIVE, "Use `equalsIgnoreCase` when String for enum comparison", useEnumCaseInsensitive));
245245
cliOptions.add(CliOption.newBoolean(FAIL_ON_UNKNOWN_PROPERTIES, "Fail Jackson de-serialization on unknown properties", this.failOnUnknownProperties));

modules/openapi-generator/src/main/resources/Java/libraries/restclient/ApiClient.mustache

+6-1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ import org.springframework.http.converter.json.MappingJackson2HttpMessageConvert
2323
{{#withXml}}
2424
import org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter;
2525
{{/withXml}}
26+
{{#generateClientAsBean}}
27+
import org.springframework.stereotype.Component;
28+
{{/generateClientAsBean}}
2629
import org.springframework.util.CollectionUtils;
2730
import org.springframework.util.LinkedMultiValueMap;
2831
import org.springframework.util.MultiValueMap;
@@ -58,8 +61,10 @@ import {{invokerPackage}}.auth.ApiKeyAuth;
5861
{{#hasOAuthMethods}}
5962
import {{invokerPackage}}.auth.OAuth;
6063
{{/hasOAuthMethods}}
61-
6264
{{>generatedAnnotation}}
65+
{{#generateClientAsBean}}
66+
@Component("{{invokerPackage}}.ApiClient")
67+
{{/generateClientAsBean}}
6368
public class ApiClient{{#jsr310}} extends JavaTimeFormatter{{/jsr310}} {
6469
public enum CollectionFormat {
6570
CSV(","), TSV("\t"), SSV(" "), PIPES("|"), MULTI(null);

modules/openapi-generator/src/main/resources/Java/libraries/restclient/api.mustache

+6
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ import {{javaxPackage}}.validation.Valid;
1717

1818
{{/useBeanValidation}}
1919
import org.springframework.beans.factory.annotation.Autowired;
20+
{{#generateClientAsBean}}
21+
import org.springframework.stereotype.Component;
22+
{{/generateClientAsBean}}
2023
import org.springframework.util.LinkedMultiValueMap;
2124
import org.springframework.util.MultiValueMap;
2225
import org.springframework.core.ParameterizedTypeReference;
@@ -30,6 +33,9 @@ import org.springframework.http.MediaType;
3033
import org.springframework.http.ResponseEntity;
3134

3235
{{>generatedAnnotation}}
36+
{{#generateClientAsBean}}
37+
@Component("{{package}}.{{classname}}")
38+
{{/generateClientAsBean}}
3339
{{#operations}}
3440
public class {{classname}} {
3541
private ApiClient apiClient;

modules/openapi-generator/src/main/resources/Java/libraries/webclient/ApiClient.mustache

+6
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ import org.springframework.web.reactive.function.client.ClientResponse;
3737
import org.springframework.web.reactive.function.BodyInserter;
3838
import org.springframework.web.reactive.function.BodyInserters;
3939
import org.springframework.web.reactive.function.client.ExchangeStrategies;
40+
{{#generateClientAsBean}}
41+
import org.springframework.stereotype.Component;
42+
{{/generateClientAsBean}}
4043
import reactor.core.publisher.Mono;
4144
import reactor.core.publisher.Flux;
4245
import java.util.Optional;
@@ -76,6 +79,9 @@ import {{invokerPackage}}.auth.OAuth;
7679
{{/hasOAuthMethods}}
7780

7881
{{>generatedAnnotation}}
82+
{{#generateClientAsBean}}
83+
@Component("{{invokerPackage}}.ApiClient")
84+
{{/generateClientAsBean}}
7985
public class ApiClient{{#jsr310}} extends JavaTimeFormatter{{/jsr310}} {
8086
public enum CollectionFormat {
8187
CSV(","), TSV("\t"), SSV(" "), PIPES("|"), MULTI(null);

modules/openapi-generator/src/main/resources/Java/libraries/webclient/api.mustache

+6
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ import {{javaxPackage}}.validation.Valid;
1717

1818
{{/useBeanValidation}}
1919
import org.springframework.beans.factory.annotation.Autowired;
20+
{{#generateClientAsBean}}
21+
import org.springframework.stereotype.Component;
22+
{{/generateClientAsBean}}
2023
import org.springframework.util.LinkedMultiValueMap;
2124
import org.springframework.util.MultiValueMap;
2225
import org.springframework.core.ParameterizedTypeReference;
@@ -32,6 +35,9 @@ import reactor.core.publisher.Mono;
3235
import reactor.core.publisher.Flux;
3336

3437
{{>generatedAnnotation}}
38+
{{#generateClientAsBean}}
39+
@Component("{{package}}.{{classname}}")
40+
{{/generateClientAsBean}}
3541
{{#operations}}
3642
public class {{classname}} {
3743
private ApiClient apiClient;

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

+68
Original file line numberDiff line numberDiff line change
@@ -2080,6 +2080,74 @@ public void shouldNotAddAdditionalModelAnnotationsToAbstractOpenApiSchema_issue1
20802080
TestUtils.assertFileContains(output.resolve("src/main/java/xyz/abcdef/api/PetApi.java"), "@Component");
20812081
}
20822082

2083+
@Test public void testRestClientWithGeneratedClientAsBeanDisabled() {
2084+
final Path output = newTempFolder();
2085+
final CodegenConfigurator configurator = new CodegenConfigurator()
2086+
.setGeneratorName("java")
2087+
.addAdditionalProperty(CodegenConstants.API_PACKAGE, "xyz.abcdef.api")
2088+
.addAdditionalProperty(JavaClientCodegen.GENERATE_CLIENT_AS_BEAN, false)
2089+
.setLibrary(RESTCLIENT)
2090+
.setInputSpec("src/test/resources/3_0/petstore.yaml")
2091+
.setOutputDir(output.toString().replace("\\", "/"));
2092+
2093+
List<File> files = new DefaultGenerator().opts(configurator.toClientOptInput()).generate();
2094+
2095+
validateJavaSourceFiles(files);
2096+
TestUtils.assertFileNotContains(output.resolve("src/main/java/xyz/abcdef/ApiClient.java"), "@Component");
2097+
TestUtils.assertFileNotContains(output.resolve("src/main/java/xyz/abcdef/api/PetApi.java"), "@Component");
2098+
}
2099+
2100+
@Test public void testRestClientWithGeneratedClientAsBeanEnabled() {
2101+
final Path output = newTempFolder();
2102+
final CodegenConfigurator configurator = new CodegenConfigurator()
2103+
.setGeneratorName("java")
2104+
.addAdditionalProperty(CodegenConstants.API_PACKAGE, "xyz.abcdef.api")
2105+
.addAdditionalProperty(JavaClientCodegen.GENERATE_CLIENT_AS_BEAN, true)
2106+
.setLibrary(RESTCLIENT)
2107+
.setInputSpec("src/test/resources/3_0/petstore.yaml")
2108+
.setOutputDir(output.toString().replace("\\", "/"));
2109+
2110+
List<File> files = new DefaultGenerator().opts(configurator.toClientOptInput()).generate();
2111+
2112+
validateJavaSourceFiles(files);
2113+
TestUtils.assertFileContains(output.resolve("src/main/java/xyz/abcdef/ApiClient.java"), "@Component");
2114+
TestUtils.assertFileContains(output.resolve("src/main/java/xyz/abcdef/api/PetApi.java"), "@Component");
2115+
}
2116+
2117+
@Test public void testWebClientWithGeneratedClientAsBeanDisabled() {
2118+
final Path output = newTempFolder();
2119+
final CodegenConfigurator configurator = new CodegenConfigurator()
2120+
.setGeneratorName("java")
2121+
.addAdditionalProperty(CodegenConstants.API_PACKAGE, "xyz.abcdef.api")
2122+
.addAdditionalProperty(JavaClientCodegen.GENERATE_CLIENT_AS_BEAN, false)
2123+
.setLibrary(WEBCLIENT )
2124+
.setInputSpec("src/test/resources/3_0/petstore.yaml")
2125+
.setOutputDir(output.toString().replace("\\", "/"));
2126+
2127+
List<File> files = new DefaultGenerator().opts(configurator.toClientOptInput()).generate();
2128+
2129+
validateJavaSourceFiles(files);
2130+
TestUtils.assertFileNotContains(output.resolve("src/main/java/xyz/abcdef/ApiClient.java"), "@Component");
2131+
TestUtils.assertFileNotContains(output.resolve("src/main/java/xyz/abcdef/api/PetApi.java"), "@Component");
2132+
}
2133+
2134+
@Test public void testWebClientWithGeneratedClientAsBeanEnabled() {
2135+
final Path output = newTempFolder();
2136+
final CodegenConfigurator configurator = new CodegenConfigurator()
2137+
.setGeneratorName("java")
2138+
.addAdditionalProperty(CodegenConstants.API_PACKAGE, "xyz.abcdef.api")
2139+
.addAdditionalProperty(JavaClientCodegen.GENERATE_CLIENT_AS_BEAN, true)
2140+
.setLibrary(WEBCLIENT )
2141+
.setInputSpec("src/test/resources/3_0/petstore.yaml")
2142+
.setOutputDir(output.toString().replace("\\", "/"));
2143+
2144+
List<File> files = new DefaultGenerator().opts(configurator.toClientOptInput()).generate();
2145+
2146+
validateJavaSourceFiles(files);
2147+
TestUtils.assertFileContains(output.resolve("src/main/java/xyz/abcdef/ApiClient.java"), "@Component");
2148+
TestUtils.assertFileContains(output.resolve("src/main/java/xyz/abcdef/api/PetApi.java"), "@Component");
2149+
}
2150+
20832151
@Test public void testRestTemplateWithUseBeanValidationEnabled() {
20842152
final Path output = newTempFolder();
20852153
final CodegenConfigurator configurator = new CodegenConfigurator()

0 commit comments

Comments
 (0)