Skip to content

Commit 7c083a0

Browse files
committed
Add useJackson3 support for apache-httpclient
1 parent 05dd7fb commit 7c083a0

6 files changed

Lines changed: 111 additions & 12 deletions

File tree

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,7 @@ public JavaClientCodegen() {
270270
cliOptions.add(CliOption.newBoolean(SUPPORT_URL_QUERY, "Generate toUrlQueryString in POJO (default to true). Available on `native`, `apache-httpclient` libraries."));
271271
cliOptions.add(CliOption.newBoolean(USE_ENUM_CASE_INSENSITIVE, "Use `equalsIgnoreCase` when String for enum comparison", useEnumCaseInsensitive));
272272
cliOptions.add(CliOption.newBoolean(FAIL_ON_UNKNOWN_PROPERTIES, "Fail Jackson de-serialization on unknown properties", this.failOnUnknownProperties));
273-
cliOptions.add(CliOption.newBoolean(USE_JACKSON_3, "Use Jackson 3 instead of Jackson 2. Supported for 'native' library (requires Java 17+) and for Spring 'resttemplate', 'webclient', and 'restclient' libraries (require useSpringBoot4=true). Incompatible with 'openApiNullable'.", this.useJackson3));
273+
cliOptions.add(CliOption.newBoolean(USE_JACKSON_3, "Use Jackson 3 instead of Jackson 2. Supported for 'native' and 'apache-httpclient' libraries (requires Java 17+) and for Spring 'resttemplate', 'webclient', and 'restclient' libraries (require useSpringBoot4=true). Incompatible with 'openApiNullable'.", this.useJackson3));
274274
cliOptions.add(CliOption.newBoolean(SUPPORT_VERTX_FUTURE, "Also generate api methods that return a vertx Future instead of taking a callback. Only `vertx` supports this option. Requires vertx 4 or greater.", this.supportVertxFuture));
275275
cliOptions.add(CliOption.newBoolean(USE_SEALED_ONE_OF_INTERFACES, "Generate the oneOf interfaces as sealed interfaces. Only supported for WebClient and RestClient.", this.useSealedOneOfInterfaces));
276276
cliOptions.add(CliOption.newBoolean(USE_UNARY_INTERCEPTOR, "If true it will generate ResponseInterceptors using a UnaryOperator. This can be usefull for manipulating the request before it gets passed, for example doing your own decryption", this.useUnaryInterceptor));
@@ -290,7 +290,7 @@ public JavaClientCodegen() {
290290
supportedLibraries.put(REST_ASSURED, "HTTP client: rest-assured 5.3.2. JSON processing: Gson 2.10.1 or Jackson 2.17.1. Only for Java 8");
291291
supportedLibraries.put(NATIVE, "HTTP client: Java native HttpClient. JSON processing: Jackson 2.17.1 (3.x if `useJackson3=true`). Only for Java11+");
292292
supportedLibraries.put(MICROPROFILE, "HTTP client: Microprofile client " + MICROPROFILE_REST_CLIENT_DEFAULT_VERSION + " (default, set desired version via `" + MICROPROFILE_REST_CLIENT_VERSION + "=x.x.x`). JSON processing: JSON-B 1.0.2 or Jackson 2.17.1");
293-
supportedLibraries.put(APACHE, "HTTP client: Apache httpclient 5.2.1. JSON processing: Jackson 2.17.1");
293+
supportedLibraries.put(APACHE, "HTTP client: Apache httpclient 5.2.1. JSON processing: Jackson 2.17.1 (3.x if `useJackson3=true`)");
294294

295295
CliOption libraryOption = new CliOption(CodegenConstants.LIBRARY, "library template (sub-template) to use");
296296
libraryOption.setEnum(supportedLibraries);
@@ -381,8 +381,8 @@ public void processOpts() {
381381
convertPropertyToBooleanAndWriteBack(USE_SPRING_BOOT4, this::setUseSpringBoot4);
382382
if (useJackson3 && (libRestClient || libRestTemplate || libWebClient) && !useSpringBoot4) {
383383
throw new IllegalArgumentException("useJackson3 for the restclient, resttemplate, and webclient libraries requires useSpringBoot4=true");
384-
} else if (useJackson3 && !libNative && !libRestClient && !libRestTemplate && !libWebClient) {
385-
throw new IllegalArgumentException("useJackson3 is only supported for the 'native', 'restclient', 'resttemplate', and 'webclient' libraries. " +
384+
} else if (useJackson3 && !libNative && !libApache && !libRestClient && !libRestTemplate && !libWebClient) {
385+
throw new IllegalArgumentException("useJackson3 is only supported for the 'native', 'apache-httpclient', 'restclient', 'resttemplate', and 'webclient' libraries. " +
386386
"The Spring libraries also require useSpringBoot4=true.");
387387
}
388388
if (useJackson3 && openApiNullable) {
@@ -824,7 +824,7 @@ public void processOpts() {
824824
additionalProperties.remove(SERIALIZATION_LIBRARY_GSON);
825825
additionalProperties.remove(SERIALIZATION_LIBRARY_JSONB);
826826
supportingFiles.add(new SupportingFile("RFC3339DateFormat.mustache", invokerFolder, "RFC3339DateFormat.java"));
827-
if (!useJackson3 || libNative || libRestTemplate || libWebClient) {
827+
if (!useJackson3 || libNative || libApache || libRestTemplate || libWebClient) {
828828
supportingFiles.add(new SupportingFile("RFC3339InstantDeserializer.mustache", invokerFolder, "RFC3339InstantDeserializer.java"));
829829
supportingFiles.add(new SupportingFile("RFC3339JavaTimeModule.mustache", invokerFolder, "RFC3339JavaTimeModule.java"));
830830
}

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

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,21 @@
22
package {{invokerPackage}};
33

44
import com.fasterxml.jackson.annotation.*;
5-
import com.fasterxml.jackson.databind.*;
5+
import {{jacksonPackage}}.databind.*;
66
{{#joda}}
7-
import com.fasterxml.jackson.datatype.joda.JodaModule;
7+
import {{jacksonPackage}}.datatype.joda.JodaModule;
88
{{/joda}}
9+
{{^useJackson3}}
910
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
11+
{{/useJackson3}}
12+
{{#useJackson3}}
13+
import tools.jackson.databind.cfg.DateTimeFeature;
14+
import tools.jackson.databind.cfg.EnumFeature;
15+
import tools.jackson.databind.json.JsonMapper;
16+
{{/useJackson3}}
1017
import java.time.OffsetDateTime;
11-
import com.fasterxml.jackson.core.type.TypeReference;
12-
import com.fasterxml.jackson.core.JsonProcessingException;
13-
import com.fasterxml.jackson.databind.JavaType;
18+
import {{jacksonPackage}}.core.type.TypeReference;
19+
import {{jacksonPackage}}.core.JsonProcessingException;
1420
{{#openApiNullable}}
1521
import org.openapitools.jackson.nullable.JsonNullableModule;
1622
{{/openApiNullable}}
@@ -135,6 +141,7 @@ public class ApiClient{{#jsr310}} extends JavaTimeFormatter{{/jsr310}} {
135141
protected static List<String> bodyMethods = Arrays.asList("POST", "PUT", "DELETE", "PATCH");
136142

137143
public ApiClient(CloseableHttpClient httpClient) {
144+
{{^useJackson3}}
138145
objectMapper = new ObjectMapper();
139146
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
140147
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, {{failOnUnknownProperties}});
@@ -151,6 +158,27 @@ public class ApiClient{{#jsr310}} extends JavaTimeFormatter{{/jsr310}} {
151158
{{/openApiNullable}}
152159
objectMapper.registerModule(new RFC3339JavaTimeModule());
153160
objectMapper.setDateFormat(ApiClient.buildDefaultDateFormat());
161+
{{/useJackson3}}
162+
{{#useJackson3}}
163+
objectMapper = JsonMapper.builder()
164+
.changeDefaultPropertyInclusion(v -> v.withValueInclusion(JsonInclude.Include.NON_NULL))
165+
{{#failOnUnknownProperties}}
166+
.enable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
167+
{{/failOnUnknownProperties}}
168+
{{^failOnUnknownProperties}}
169+
.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
170+
{{/failOnUnknownProperties}}
171+
.disable(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE)
172+
.disable(DateTimeFeature.WRITE_DATES_AS_TIMESTAMPS)
173+
.enable(EnumFeature.WRITE_ENUMS_USING_TO_STRING)
174+
.enable(EnumFeature.READ_ENUMS_USING_TO_STRING)
175+
{{#joda}}
176+
.addModule(new JodaModule())
177+
{{/joda}}
178+
.addModule(new RFC3339JavaTimeModule())
179+
.defaultDateFormat(ApiClient.buildDefaultDateFormat())
180+
.build();
181+
{{/useJackson3}}
154182

155183
dateFormat = ApiClient.buildDefaultDateFormat();
156184

modules/openapi-generator/src/main/resources/Java/libraries/apache-httpclient/BaseApi.mustache

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{{>licenseInfo}}
22
package {{invokerPackage}};
33

4-
import com.fasterxml.jackson.core.type.TypeReference;
4+
import {{jacksonPackage}}.core.type.TypeReference;
55

66
import java.util.Collections;
77
import java.util.Map;

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{{>licenseInfo}}
22
package {{package}};
33

4-
import com.fasterxml.jackson.core.type.TypeReference;
4+
import {{jacksonPackage}}.core.type.TypeReference;
55

66
import {{invokerPackage}}.ApiException;
77
import {{invokerPackage}}.ApiClient;

modules/openapi-generator/src/main/resources/Java/libraries/apache-httpclient/build.gradle.mustache

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,14 @@ if(hasProperty('target') && target == 'android') {
7878
apply plugin: 'java'
7979
apply plugin: 'maven-publish'
8080
81+
{{^useJackson3}}
8182
sourceCompatibility = JavaVersion.VERSION_1_8
8283
targetCompatibility = JavaVersion.VERSION_1_8
84+
{{/useJackson3}}
85+
{{#useJackson3}}
86+
sourceCompatibility = JavaVersion.VERSION_17
87+
targetCompatibility = JavaVersion.VERSION_17
88+
{{/useJackson3}}
8389

8490
publishing {
8591
publications {
@@ -114,12 +120,18 @@ if(hasProperty('target') && target == 'android') {
114120

115121
ext {
116122
swagger_annotations_version = "1.6.6"
123+
{{^useJackson3}}
117124
jackson_version = "2.21.1"
118125
jackson_annotations_version = "2.21"
119126
jackson_databind_version = "2.21.1"
120127
{{#openApiNullable}}
121128
jackson_databind_nullable_version = "0.2.10"
122129
{{/openApiNullable}}
130+
{{/useJackson3}}
131+
{{#useJackson3}}
132+
jackson3_version = "3.1.0"
133+
jackson_annotations_version = "2.21"
134+
{{/useJackson3}}
123135
jakarta_annotation_version = "1.3.5"
124136
httpclient_version = "5.1.3"
125137
jodatime_version = "2.9.9"
@@ -130,6 +142,7 @@ dependencies {
130142
implementation "io.swagger:swagger-annotations:$swagger_annotations_version"
131143
implementation "com.google.code.findbugs:jsr305:3.0.2"
132144
implementation "org.apache.httpcomponents.client5:httpclient5:$httpclient_version"
145+
{{^useJackson3}}
133146
implementation "com.fasterxml.jackson.core:jackson-core:$jackson_version"
134147
implementation "com.fasterxml.jackson.core:jackson-annotations:$jackson_annotations_version"
135148
implementation "com.fasterxml.jackson.core:jackson-databind:$jackson_databind_version"
@@ -141,6 +154,16 @@ dependencies {
141154
implementation "com.fasterxml.jackson.datatype:jackson-datatype-joda:$jackson_version"
142155
{{/joda}}
143156
implementation "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:$jackson_version"
157+
{{/useJackson3}}
158+
{{#useJackson3}}
159+
implementation "tools.jackson.core:jackson-core:$jackson3_version"
160+
implementation "com.fasterxml.jackson.core:jackson-annotations:$jackson_annotations_version"
161+
implementation "tools.jackson.core:jackson-databind:$jackson3_version"
162+
implementation "tools.jackson.jakarta.rs:jackson-jakarta-rs-json-provider:$jackson3_version"
163+
{{#joda}}
164+
implementation "tools.jackson.datatype:jackson-datatype-joda:$jackson3_version"
165+
{{/joda}}
166+
{{/useJackson3}}
144167
implementation "jakarta.annotation:jakarta.annotation-api:$jakarta_annotation_version"
145168
testImplementation "junit:junit:$junit_version"
146169
}

modules/openapi-generator/src/main/resources/Java/libraries/apache-httpclient/pom.mustache

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,7 @@
244244
</dependency>
245245

246246
<!-- JSON processing: jackson -->
247+
{{^useJackson3}}
247248
<dependency>
248249
<groupId>com.fasterxml.jackson.core</groupId>
249250
<artifactId>jackson-core</artifactId>
@@ -295,6 +296,47 @@
295296
<artifactId>jackson-datatype-jsr310</artifactId>
296297
<version>${jackson-version}</version>
297298
</dependency>
299+
{{/useJackson3}}
300+
{{#useJackson3}}
301+
<dependency>
302+
<groupId>tools.jackson.core</groupId>
303+
<artifactId>jackson-core</artifactId>
304+
<version>${jackson3-version}</version>
305+
</dependency>
306+
<dependency>
307+
<groupId>com.fasterxml.jackson.core</groupId>
308+
<artifactId>jackson-annotations</artifactId>
309+
<version>${jackson-annotations-version}</version>
310+
</dependency>
311+
<dependency>
312+
<groupId>tools.jackson.core</groupId>
313+
<artifactId>jackson-databind</artifactId>
314+
<version>${jackson3-version}</version>
315+
</dependency>
316+
{{^useJakartaEe}}
317+
<dependency>
318+
<groupId>tools.jackson.jakarta.rs</groupId>
319+
<artifactId>jackson-jakarta-rs-json-provider</artifactId>
320+
<version>${jackson3-version}</version>
321+
</dependency>
322+
{{/useJakartaEe}}
323+
{{#useJakartaEe}}
324+
<dependency>
325+
<groupId>tools.jackson.jakarta.rs</groupId>
326+
<artifactId>jackson-jakarta-rs-json-provider</artifactId>
327+
<version>${jackson3-version}</version>
328+
</dependency>
329+
{{/useJakartaEe}}
330+
{{#joda}}
331+
<dependency>
332+
<groupId>tools.jackson.datatype</groupId>
333+
<artifactId>jackson-datatype-joda</artifactId>
334+
<version>${jackson3-version}</version>
335+
</dependency>
336+
{{/joda}}
337+
<!-- Note: jackson-datatype-jsr310 is included in jackson-databind for Jackson 3 -->
338+
<!-- Note: jackson-databind-nullable is not yet available for Jackson 3 -->
339+
{{/useJackson3}}
298340
{{#useBeanValidation}}
299341
<!-- Bean Validation API support -->
300342
<dependency>
@@ -351,12 +393,18 @@
351393
<swagger-annotations-version>2.2.15</swagger-annotations-version>
352394
{{/swagger2AnnotationLibrary}}
353395
<httpclient-version>5.2.1</httpclient-version>
396+
{{^useJackson3}}
354397
<jackson-version>2.21.1</jackson-version>
355398
<jackson-annotations-version>2.21</jackson-annotations-version>
356399
<jackson-databind-version>2.21.1</jackson-databind-version>
357400
{{#openApiNullable}}
358401
<jackson-databind-nullable-version>0.2.10</jackson-databind-nullable-version>
359402
{{/openApiNullable}}
403+
{{/useJackson3}}
404+
{{#useJackson3}}
405+
<jackson3-version>3.1.0</jackson3-version>
406+
<jackson-annotations-version>2.21</jackson-annotations-version>
407+
{{/useJackson3}}
360408
{{#useJakartaEe}}
361409
<jakarta-annotation-version>2.1.1</jakarta-annotation-version>
362410
<beanvalidation-version>3.0.2</beanvalidation-version>

0 commit comments

Comments
 (0)