Skip to content

Commit 836e86a

Browse files
committed
Add support for OpenAPI Nullable for Jackson 3
1 parent 7c083a0 commit 836e86a

11 files changed

Lines changed: 69 additions & 6 deletions

File tree

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

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -385,10 +385,6 @@ public void processOpts() {
385385
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
}
388-
if (useJackson3 && openApiNullable) {
389-
throw new IllegalArgumentException("openApiNullable=true is not compatible with useJackson3=true " +
390-
"(jackson-databind-nullable has no Jackson 3 release). Please set openApiNullable=false explicitly.");
391-
}
392388

393389
if (this.useJackson3) {
394390
this.applyJackson3Package();

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,12 @@ import java.time.OffsetDateTime;
1818
import {{jacksonPackage}}.core.type.TypeReference;
1919
import {{jacksonPackage}}.core.JsonProcessingException;
2020
{{#openApiNullable}}
21+
{{^useJackson3}}
2122
import org.openapitools.jackson.nullable.JsonNullableModule;
23+
{{/useJackson3}}
24+
{{#useJackson3}}
25+
import org.openapitools.jackson.nullable.JsonNullableJackson3Module;
26+
{{/useJackson3}}
2227
{{/openApiNullable}}
2328

2429
import org.apache.hc.client5.http.cookie.BasicCookieStore;
@@ -175,6 +180,9 @@ public class ApiClient{{#jsr310}} extends JavaTimeFormatter{{/jsr310}} {
175180
{{#joda}}
176181
.addModule(new JodaModule())
177182
{{/joda}}
183+
{{#openApiNullable}}
184+
.addModule(new JsonNullableJackson3Module())
185+
{{/openApiNullable}}
178186
.addModule(new RFC3339JavaTimeModule())
179187
.defaultDateFormat(ApiClient.buildDefaultDateFormat())
180188
.build();

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,9 @@ ext {
131131
{{#useJackson3}}
132132
jackson3_version = "3.1.0"
133133
jackson_annotations_version = "2.21"
134+
{{#openApiNullable}}
135+
jackson_databind_nullable_version = "0.2.10"
136+
{{/openApiNullable}}
134137
{{/useJackson3}}
135138
jakarta_annotation_version = "1.3.5"
136139
httpclient_version = "5.1.3"
@@ -160,6 +163,9 @@ dependencies {
160163
implementation "com.fasterxml.jackson.core:jackson-annotations:$jackson_annotations_version"
161164
implementation "tools.jackson.core:jackson-databind:$jackson3_version"
162165
implementation "tools.jackson.jakarta.rs:jackson-jakarta-rs-json-provider:$jackson3_version"
166+
{{#openApiNullable}}
167+
implementation "org.openapitools:jackson-databind-nullable:$jackson_databind_nullable_version"
168+
{{/openApiNullable}}
163169
{{#joda}}
164170
implementation "tools.jackson.datatype:jackson-datatype-joda:$jackson3_version"
165171
{{/joda}}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -335,7 +335,6 @@
335335
</dependency>
336336
{{/joda}}
337337
<!-- Note: jackson-datatype-jsr310 is included in jackson-databind for Jackson 3 -->
338-
<!-- Note: jackson-databind-nullable is not yet available for Jackson 3 -->
339338
{{/useJackson3}}
340339
{{#useBeanValidation}}
341340
<!-- Bean Validation API support -->
@@ -404,6 +403,9 @@
404403
{{#useJackson3}}
405404
<jackson3-version>3.1.0</jackson3-version>
406405
<jackson-annotations-version>2.21</jackson-annotations-version>
406+
{{#openApiNullable}}
407+
<jackson-databind-nullable-version>0.2.10</jackson-databind-nullable-version>
408+
{{/openApiNullable}}
407409
{{/useJackson3}}
408410
{{#useJakartaEe}}
409411
<jakarta-annotation-version>2.1.1</jakarta-annotation-version>

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ import org.openapitools.jackson.nullable.JsonNullableModule;
1515
import tools.jackson.databind.cfg.DateTimeFeature;
1616
import tools.jackson.databind.cfg.EnumFeature;
1717
import tools.jackson.databind.json.JsonMapper;
18+
{{#openApiNullable}}
19+
import org.openapitools.jackson.nullable.JsonNullableJackson3Module;
20+
{{/openApiNullable}}
1821
{{/useJackson3}}
1922

2023
import java.io.InputStream;
@@ -237,6 +240,9 @@ public class ApiClient {
237240
.enable(EnumFeature.WRITE_ENUMS_USING_TO_STRING)
238241
.enable(EnumFeature.READ_ENUMS_USING_TO_STRING)
239242
.disable(DateTimeFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE)
243+
{{#openApiNullable}}
244+
.addModule(new JsonNullableJackson3Module())
245+
{{/openApiNullable}}
240246
.addModule(new RFC3339JavaTimeModule())
241247
.build();
242248
{{/useJackson3}}

modules/openapi-generator/src/main/resources/Java/libraries/native/JSON.mustache

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
1414
{{#useJackson3}}
1515
import tools.jackson.databind.cfg.DateTimeFeature;
1616
import tools.jackson.databind.cfg.EnumFeature;
17+
{{#openApiNullable}}
18+
import org.openapitools.jackson.nullable.JsonNullableJackson3Module;
19+
{{/openApiNullable}}
1720
{{/useJackson3}}
1821
{{#joda}}
1922
import {{jacksonPackage}}.datatype.joda.JodaModule;
@@ -76,6 +79,9 @@ public class JSON {
7679
{{#joda}}
7780
jsonMapperBuilder.addModule(new JodaModule());
7881
{{/joda}}
82+
{{#openApiNullable}}
83+
jsonMapperBuilder.addModule(new JsonNullableJackson3Module());
84+
{{/openApiNullable}}
7985
mapper = jsonMapperBuilder.build();
8086
{{/useJackson3}}
8187
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,9 @@ dependencies {
122122
implementation "tools.jackson.core:jackson-core:$jackson3_version"
123123
implementation "com.fasterxml.jackson.core:jackson-annotations:$jackson_annotations_version"
124124
implementation "tools.jackson.core:jackson-databind:$jackson3_version"
125+
{{#openApiNullable}}
126+
implementation "org.openapitools:jackson-databind-nullable:0.2.10"
127+
{{/openApiNullable}}
125128
{{/useJackson3}}
126129
implementation "jakarta.annotation:jakarta.annotation-api:$jakarta_annotation_version"
127130
{{#useBeanValidation}}

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,11 @@
261261
<version>${jackson3-version}</version>
262262
</dependency>
263263
<!-- Note: jackson-datatype-jsr310 is included in jackson-databind for Jackson 3 -->
264-
<!-- Note: jackson-databind-nullable is not yet available for Jackson 3 -->
264+
<dependency>
265+
<groupId>org.openapitools</groupId>
266+
<artifactId>jackson-databind-nullable</artifactId>
267+
<version>${jackson-databind-nullable-version}</version>
268+
</dependency>
265269
{{/useJackson3}}
266270
267271
<!-- @Nullable annotation -->
@@ -334,6 +338,7 @@
334338
{{#useJackson3}}
335339
<jackson3-version>3.1.0</jackson3-version>
336340
<jackson-annotations-version>2.21</jackson-annotations-version>
341+
<jackson-databind-nullable-version>0.2.10</jackson-databind-nullable-version>
337342
{{/useJackson3}}
338343
{{#useJakartaEe}}
339344
<jakarta-annotation-version>2.1.1</jakarta-annotation-version>

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,12 @@ import org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConve
3030

3131
import java.util.function.Consumer;
3232
{{#openApiNullable}}
33+
{{^useJackson3}}
3334
import org.openapitools.jackson.nullable.JsonNullableModule;
35+
{{/useJackson3}}
36+
{{#useJackson3}}
37+
import org.openapitools.jackson.nullable.JsonNullableJackson3Module;
38+
{{/useJackson3}}
3439
{{/openApiNullable}}
3540
{{#generateClientAsBean}}
3641
import org.springframework.beans.factory.annotation.Autowired;
@@ -192,6 +197,9 @@ public class ApiClient{{#jsr310}} extends JavaTimeFormatter{{/jsr310}} {
192197
{{^failOnUnknownProperties}}
193198
.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
194199
{{/failOnUnknownProperties}}
200+
{{#openApiNullable}}
201+
.addModule(new JsonNullableJackson3Module())
202+
{{/openApiNullable}}
195203
.build();
196204
}
197205
{{/useJackson3}}
@@ -233,7 +241,12 @@ public class ApiClient{{#jsr310}} extends JavaTimeFormatter{{/jsr310}} {
233241
XmlMapper xmlMapper = new XmlMapper();
234242
xmlMapper.configure(ToXmlGenerator.Feature.WRITE_XML_DECLARATION, true);
235243
{{#openApiNullable}}
244+
{{^useJackson3}}
236245
xmlMapper.registerModule(new JsonNullableModule());
246+
{{/useJackson3}}
247+
{{#useJackson3}}
248+
xmlMapper.registerModule(new JsonNullableJackson3Module());
249+
{{/useJackson3}}
237250
{{/openApiNullable}}
238251
{{/withXml}}
239252

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,12 @@ import org.springframework.web.client.RestTemplate;
4040
import org.springframework.web.util.UriComponentsBuilder;
4141
import org.springframework.web.util.DefaultUriBuilderFactory;
4242
{{#openApiNullable}}
43+
{{^useJackson3}}
4344
import org.openapitools.jackson.nullable.JsonNullableModule;
45+
{{/useJackson3}}
46+
{{#useJackson3}}
47+
import org.openapitools.jackson.nullable.JsonNullableJackson3Module;
48+
{{/useJackson3}}
4449
{{/openApiNullable}}
4550

4651

@@ -874,7 +879,12 @@ public class ApiClient{{#jsr310}} extends JavaTimeFormatter{{/jsr310}} {
874879
XmlMapper xmlMapper = new XmlMapper();
875880
xmlMapper.configure(ToXmlGenerator.Feature.WRITE_XML_DECLARATION, true);
876881
{{#openApiNullable}}
882+
{{^useJackson3}}
877883
xmlMapper.registerModule(new JsonNullableModule());
884+
{{/useJackson3}}
885+
{{#useJackson3}}
886+
xmlMapper.registerModule(new JsonNullableJackson3Module());
887+
{{/useJackson3}}
878888
{{/openApiNullable}}
879889
messageConverters.add(new MappingJackson2XmlHttpMessageConverter(xmlMapper));
880890

0 commit comments

Comments
 (0)