diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/restclient/ApiClient.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/restclient/ApiClient.mustache index 8cd74f13c28f..2a26a969402f 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/restclient/ApiClient.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/restclient/ApiClient.mustache @@ -206,6 +206,9 @@ public class ApiClient{{#jsr310}} extends JavaTimeFormatter{{/jsr310}} { {{#useJackson3}} public static JsonMapper createDefaultMapper(@Nullable DateFormat dateFormat) { + if (null == dateFormat) { + dateFormat = createDefaultDateFormat(); + } return JsonMapper.builder() .defaultDateFormat(dateFormat) {{#failOnUnknownProperties}} diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/webclient/ApiClient.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/webclient/ApiClient.mustache index e9f161b724b7..6209b2334de2 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/webclient/ApiClient.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/webclient/ApiClient.mustache @@ -183,6 +183,9 @@ public class ApiClient{{#jsr310}} extends JavaTimeFormatter{{/jsr310}} { {{#useJackson3}} public static JsonMapper createDefaultMapper(@Nullable DateFormat dateFormat) { + if (null == dateFormat) { + dateFormat = createDefaultDateFormat(); + } return JsonMapper.builder() .defaultDateFormat(dateFormat) {{#failOnUnknownProperties}} 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 810fdb1fb22f..3709d0652dbb 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 @@ -3671,6 +3671,37 @@ public void testRestClientWithXMLAndJackson3AndOpenApiNullable_issue_23860() { ); } + @Test(description = "Regression test for issue #24588: with useJackson3=true the generated" + + " createDefaultMapper must fall back to createDefaultDateFormat() when called with" + + " null, like the Jackson 2 branch does. Otherwise date-time fields serialize as" + + " epoch numbers instead of RFC 3339.") + public void testJackson3DefaultMapperFallsBackToDefaultDateFormat_issue_24588() { + for (String library : new String[]{JavaClientCodegen.RESTCLIENT, JavaClientCodegen.WEBCLIENT}) { + final Path output = newTempFolder(); + final CodegenConfigurator configurator = new CodegenConfigurator() + .setGeneratorName(JAVA_GENERATOR) + .setLibrary(library) + .setAdditionalProperties(Map.of( + CodegenConstants.API_PACKAGE, "xyz.abcdef.api", + JavaClientCodegen.USE_JACKSON_3, true, + JavaClientCodegen.USE_SPRING_BOOT4, true, + JavaClientCodegen.OPENAPI_NULLABLE, false + )) + .setInputSpec("src/test/resources/3_1/java/petstore.yaml") + .setOutputDir(output.toString().replace("\\", "/")); + + List files = new DefaultGenerator().opts(configurator.toClientOptInput()).generate(); + + validateJavaSourceFiles(files); + assertFileContains( + output.resolve("src/main/java/xyz/abcdef/ApiClient.java"), + "public static JsonMapper createDefaultMapper(@Nullable DateFormat dateFormat) {", + "if (null == dateFormat) {", + "dateFormat = createDefaultDateFormat();" + ); + } + } + @Test public void testRestClientWithUseSingleRequestParameter_issue_19406() { diff --git a/samples/client/petstore/java/restclient-springBoot4-jackson3-jspecify/src/main/java/org/openapitools/client/ApiClient.java b/samples/client/petstore/java/restclient-springBoot4-jackson3-jspecify/src/main/java/org/openapitools/client/ApiClient.java index 48a1838c792c..6685f4158cb3 100644 --- a/samples/client/petstore/java/restclient-springBoot4-jackson3-jspecify/src/main/java/org/openapitools/client/ApiClient.java +++ b/samples/client/petstore/java/restclient-springBoot4-jackson3-jspecify/src/main/java/org/openapitools/client/ApiClient.java @@ -134,6 +134,9 @@ public static DateFormat createDefaultDateFormat() { } public static JsonMapper createDefaultMapper(@Nullable DateFormat dateFormat) { + if (null == dateFormat) { + dateFormat = createDefaultDateFormat(); + } return JsonMapper.builder() .defaultDateFormat(dateFormat) .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) diff --git a/samples/client/petstore/java/restclient-springBoot4-jackson3/src/main/java/org/openapitools/client/ApiClient.java b/samples/client/petstore/java/restclient-springBoot4-jackson3/src/main/java/org/openapitools/client/ApiClient.java index 73360ed933ee..76b758db6fa5 100644 --- a/samples/client/petstore/java/restclient-springBoot4-jackson3/src/main/java/org/openapitools/client/ApiClient.java +++ b/samples/client/petstore/java/restclient-springBoot4-jackson3/src/main/java/org/openapitools/client/ApiClient.java @@ -135,6 +135,9 @@ public static DateFormat createDefaultDateFormat() { } public static JsonMapper createDefaultMapper(@Nullable DateFormat dateFormat) { + if (null == dateFormat) { + dateFormat = createDefaultDateFormat(); + } return JsonMapper.builder() .defaultDateFormat(dateFormat) .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) diff --git a/samples/client/petstore/java/webclient-springBoot4-jackson3-jspecify/src/main/java/org/openapitools/client/ApiClient.java b/samples/client/petstore/java/webclient-springBoot4-jackson3-jspecify/src/main/java/org/openapitools/client/ApiClient.java index 1cf42ab129f2..224af2c7addd 100644 --- a/samples/client/petstore/java/webclient-springBoot4-jackson3-jspecify/src/main/java/org/openapitools/client/ApiClient.java +++ b/samples/client/petstore/java/webclient-springBoot4-jackson3-jspecify/src/main/java/org/openapitools/client/ApiClient.java @@ -148,6 +148,9 @@ public static DateFormat createDefaultDateFormat() { } public static JsonMapper createDefaultMapper(@Nullable DateFormat dateFormat) { + if (null == dateFormat) { + dateFormat = createDefaultDateFormat(); + } return JsonMapper.builder() .defaultDateFormat(dateFormat) .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) diff --git a/samples/client/petstore/java/webclient-springBoot4-jackson3/src/main/java/org/openapitools/client/ApiClient.java b/samples/client/petstore/java/webclient-springBoot4-jackson3/src/main/java/org/openapitools/client/ApiClient.java index 995c0c43a1ac..5f3e9135c3ef 100644 --- a/samples/client/petstore/java/webclient-springBoot4-jackson3/src/main/java/org/openapitools/client/ApiClient.java +++ b/samples/client/petstore/java/webclient-springBoot4-jackson3/src/main/java/org/openapitools/client/ApiClient.java @@ -149,6 +149,9 @@ public static DateFormat createDefaultDateFormat() { } public static JsonMapper createDefaultMapper(@Nullable DateFormat dateFormat) { + if (null == dateFormat) { + dateFormat = createDefaultDateFormat(); + } return JsonMapper.builder() .defaultDateFormat(dateFormat) .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)