From f65986c720104551b572a15cb2ee4f581e627db9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20B=C3=89TI?= Date: Fri, 16 Oct 2026 15:05:31 +0200 Subject: [PATCH] Map integer properties with int64 format to long A JSON integer property declaring "format": "int64" is generated as long when required, java.lang.Long otherwise. Integer properties without this format keep mapping to int and java.lang.Integer. Fixes #108 --- README.md | 2 ++ .../JsonSchemaContent.java | 6 ++++++ .../case1/Int64Properties.java | 12 ++++++++++++ .../case1/customer.json | 10 +++++++++- 4 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 tests/src/test/java/com/cosium/json_schema_to_java_record_tests/case1/Int64Properties.java diff --git a/README.md b/README.md index e27f197..21a6831 100644 --- a/README.md +++ b/README.md @@ -109,6 +109,8 @@ An annotation processor converting JSON schemas to java records. | array | | | Immutable java.util.List | | number | | required | double | | number | | non required | java.lang.Double | +| integer | int64 | required | long | +| integer | int64 | non required | java.lang.Long | | integer | | required | int | | integer | | non required | java.lang.Integer | | boolean | | required | boolean | diff --git a/core/src/main/java/com/cosium/json_schema_to_java_record/JsonSchemaContent.java b/core/src/main/java/com/cosium/json_schema_to_java_record/JsonSchemaContent.java index 34f5a36..ecae76e 100644 --- a/core/src/main/java/com/cosium/json_schema_to_java_record/JsonSchemaContent.java +++ b/core/src/main/java/com/cosium/json_schema_to_java_record/JsonSchemaContent.java @@ -95,6 +95,12 @@ public TypeName writeJavaType( yield ClassName.get(Double.class); } case INTEGER -> { + if ("int64".equals(format)) { + if (preferPrimitive) { + yield TypeName.LONG; + } + yield ClassName.get(Long.class); + } if (preferPrimitive) { yield TypeName.INT; } diff --git a/tests/src/test/java/com/cosium/json_schema_to_java_record_tests/case1/Int64Properties.java b/tests/src/test/java/com/cosium/json_schema_to_java_record_tests/case1/Int64Properties.java new file mode 100644 index 0000000..e2ecd55 --- /dev/null +++ b/tests/src/test/java/com/cosium/json_schema_to_java_record_tests/case1/Int64Properties.java @@ -0,0 +1,12 @@ +package com.cosium.json_schema_to_java_record_tests.case1; + +import java.util.function.Function; + +/** + * Fails to compile if an int64 property is not generated as a long: an int would box to Integer. + */ +class Int64Properties { + + static final Function REQUIRED = Customer::id; + static final Function NON_REQUIRED = Customer::referrerId; +} diff --git a/tests/src/test/resources/com/cosium/json_schema_to_java_record_tests/case1/customer.json b/tests/src/test/resources/com/cosium/json_schema_to_java_record_tests/case1/customer.json index 772987a..4d2aa97 100644 --- a/tests/src/test/resources/com/cosium/json_schema_to_java_record_tests/case1/customer.json +++ b/tests/src/test/resources/com/cosium/json_schema_to_java_record_tests/case1/customer.json @@ -3,6 +3,14 @@ "$id": "customer", "type": "object", "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "referrerId": { + "type": "integer", + "format": "int64" + }, "firstName": { "type": "string" }, @@ -19,5 +27,5 @@ } } }, - "required": [ "firstName", "lastName" ] + "required": [ "id", "firstName", "lastName" ] } \ No newline at end of file