From 1b965a8250d0eaaa2cdc57f4adf19ebaa3e28726 Mon Sep 17 00:00:00 2001 From: Mark Probst Date: Mon, 20 Jul 2026 19:07:46 -0400 Subject: [PATCH 1/2] fix(java): emit @JsonFormat for optional date/time properties (#1593) With --datetime-provider legacy, JavaJacksonRenderer switched on the raw property type kind to decide whether to add @JsonFormat. Required date/date-time/time properties have that kind directly, but optional properties are represented as a nullable union, so the switch fell through and the annotation was silently omitted, producing inconsistent serialization between required and optional fields of the same format. Unwrap a nullable union to its non-null member (matching the pattern already used in JavaRenderer.javaType) before switching on the kind. Added test/inputs/schema/optional-date-time.schema (+ .1.json sample) with matching required/optional date, time, and date-time properties, exercised by the existing schema-java-datetime-legacy fixture. Fixes #1593 Co-Authored-By: gpt-5.6-sol via pi --- .../src/language/Java/JavaJacksonRenderer.ts | 12 +++++-- test/inputs/schema/optional-date-time.1.json | 8 +++++ test/inputs/schema/optional-date-time.schema | 35 +++++++++++++++++++ 3 files changed, 53 insertions(+), 2 deletions(-) create mode 100644 test/inputs/schema/optional-date-time.1.json create mode 100644 test/inputs/schema/optional-date-time.schema diff --git a/packages/quicktype-core/src/language/Java/JavaJacksonRenderer.ts b/packages/quicktype-core/src/language/Java/JavaJacksonRenderer.ts index 15c24bebed..35407b4cb7 100644 --- a/packages/quicktype-core/src/language/Java/JavaJacksonRenderer.ts +++ b/packages/quicktype-core/src/language/Java/JavaJacksonRenderer.ts @@ -10,7 +10,10 @@ import { type TypeKind, UnionType, } from "../../Type/index.js"; -import { removeNullFromUnion } from "../../Type/TypeUtils.js"; +import { + nullableFromUnion, + removeNullFromUnion, +} from "../../Type/TypeUtils.js"; import { JavaRenderer } from "./JavaRenderer.js"; import { stringEscape } from "./utils.js"; @@ -58,7 +61,12 @@ export class JacksonRenderer extends JavaRenderer { `@JsonProperty("${stringEscape(jsonName)}")`, ]; - switch (p.type.kind) { + const propertyType = + p.type instanceof UnionType + ? (nullableFromUnion(p.type) ?? p.type) + : p.type; + + switch (propertyType.kind) { case "date-time": this._dateTimeProvider.dateTimeJacksonAnnotations.forEach( (annotation) => { diff --git a/test/inputs/schema/optional-date-time.1.json b/test/inputs/schema/optional-date-time.1.json new file mode 100644 index 0000000000..ba76d40946 --- /dev/null +++ b/test/inputs/schema/optional-date-time.1.json @@ -0,0 +1,8 @@ +{ + "required-date": "2024-01-02", + "required-time": "12:34:56Z", + "required-date-time": "2024-01-02T12:34:56Z", + "optional-date": "2024-01-02", + "optional-time": "12:34:56Z", + "optional-date-time": "2024-01-02T12:34:56Z" +} diff --git a/test/inputs/schema/optional-date-time.schema b/test/inputs/schema/optional-date-time.schema new file mode 100644 index 0000000000..485d7f1a02 --- /dev/null +++ b/test/inputs/schema/optional-date-time.schema @@ -0,0 +1,35 @@ +{ + "type": "object", + "additionalProperties": false, + "properties": { + "required-date": { + "type": "string", + "format": "date" + }, + "required-time": { + "type": "string", + "format": "time" + }, + "required-date-time": { + "type": "string", + "format": "date-time" + }, + "optional-date": { + "type": "string", + "format": "date" + }, + "optional-time": { + "type": "string", + "format": "time" + }, + "optional-date-time": { + "type": "string", + "format": "date-time" + } + }, + "required": [ + "required-date", + "required-time", + "required-date-time" + ] +} From 50685d0b2e207b21973bff39df7b0dd90a4718b4 Mon Sep 17 00:00:00 2001 From: Mark Probst Date: Mon, 20 Jul 2026 19:37:13 -0400 Subject: [PATCH 2/2] test: add missing fixture cases for optional-date-time.schema (#3049) Co-Authored-By: Claude --- .../schema/optional-date-time.1.fail.date-time.json | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 test/inputs/schema/optional-date-time.1.fail.date-time.json diff --git a/test/inputs/schema/optional-date-time.1.fail.date-time.json b/test/inputs/schema/optional-date-time.1.fail.date-time.json new file mode 100644 index 0000000000..f7c14ea5ff --- /dev/null +++ b/test/inputs/schema/optional-date-time.1.fail.date-time.json @@ -0,0 +1,8 @@ +{ + "required-date": "2024-01-02", + "required-time": "12:34:56Z", + "required-date-time": "not a valid date-time at all", + "optional-date": "2024-01-02", + "optional-time": "12:34:56Z", + "optional-date-time": "2024-01-02T12:34:56Z" +}