From 4bfa0d51fb5b5997f329ddd321e8b84f697b18c5 Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Mon, 1 Sep 2025 11:58:47 -0400 Subject: [PATCH 1/4] fix record nested generics --- .../generics/MyListWrapperRecord.java | 8 ++++ .../generics/MyListWrapperRecordTest.java | 39 +++++++++++++++++++ .../avaje/jsonb/generator/FieldProperty.java | 7 ++-- 3 files changed, 51 insertions(+), 3 deletions(-) create mode 100644 blackbox-test/src/main/java/org/example/customer/generics/MyListWrapperRecord.java create mode 100644 blackbox-test/src/test/java/org/example/customer/generics/MyListWrapperRecordTest.java diff --git a/blackbox-test/src/main/java/org/example/customer/generics/MyListWrapperRecord.java b/blackbox-test/src/main/java/org/example/customer/generics/MyListWrapperRecord.java new file mode 100644 index 00000000..d598890e --- /dev/null +++ b/blackbox-test/src/main/java/org/example/customer/generics/MyListWrapperRecord.java @@ -0,0 +1,8 @@ +package org.example.customer.generics; + +import java.util.List; + +import io.avaje.jsonb.Json; + +@Json +public record MyListWrapperRecord(List list) {} diff --git a/blackbox-test/src/test/java/org/example/customer/generics/MyListWrapperRecordTest.java b/blackbox-test/src/test/java/org/example/customer/generics/MyListWrapperRecordTest.java new file mode 100644 index 00000000..07184dfc --- /dev/null +++ b/blackbox-test/src/test/java/org/example/customer/generics/MyListWrapperRecordTest.java @@ -0,0 +1,39 @@ +package org.example.customer.generics; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.List; + +import org.example.customer.Address; +import org.junit.jupiter.api.Test; + +import io.avaje.jsonb.Jsonb; +import io.avaje.jsonb.Types; + +class MyListWrapperRecordTest { + + Jsonb jsonb = Jsonb.instance(); + + private static MyListWrapperRecord
createData() { + return new MyListWrapperRecord<>(List.of(new Address(90L, "one"), new Address(91L, "two"))); + } + + @SuppressWarnings("unchecked") + @Test + void toJson() { + var bean = createData(); + + var type = jsonb.type(MyListWrapperRecord.class); + + String asJson = type.toJson(bean); + assertThat(asJson) + .isEqualTo("{\"list\":[{\"id\":90,\"street\":\"one\"},{\"id\":91,\"street\":\"two\"}]}"); + + var jsonOfParams = jsonb.type(Types.newParameterizedType(MyListWrapper.class, Address.class)); + + var wrapper = (MyListWrapperRecord
) jsonOfParams.fromJson(asJson); + assertThat(wrapper.list()).hasSize(2); + assertThat(wrapper.list().get(0)).isInstanceOf(Address.class); + assertThat(wrapper.list().get(1)).isInstanceOf(Address.class); + } +} diff --git a/jsonb-generator/src/main/java/io/avaje/jsonb/generator/FieldProperty.java b/jsonb-generator/src/main/java/io/avaje/jsonb/generator/FieldProperty.java index 6abc72bf..805cb1c8 100644 --- a/jsonb-generator/src/main/java/io/avaje/jsonb/generator/FieldProperty.java +++ b/jsonb-generator/src/main/java/io/avaje/jsonb/generator/FieldProperty.java @@ -1,11 +1,12 @@ package io.avaje.jsonb.generator; -import javax.lang.model.type.TypeMirror; import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.Set; +import javax.lang.model.type.TypeMirror; + final class FieldProperty { private final boolean raw; @@ -182,7 +183,7 @@ private boolean isObjectBoolean() { } private boolean isBoolean() { - return ("boolean".equals(genericType.topType()) || "java.lang.Boolean".equals(genericType.topType())); + return "boolean".equals(genericType.topType()) || "java.lang.Boolean".equals(genericType.topType()); } private boolean nameHasIsPrefix() { @@ -288,7 +289,7 @@ void writeFromJsonVariables(Append writer, String num) { } void writeFromJsonVariablesRecord(Append writer, String num) { - final String type = genericTypeParameter ? "Object" : genericType.shortType(); + final String type = typeParamToObject(genericType.shortType()); writer.append(" %s _val$%s = %s;", pad(type), fieldName + num, defaultValue).eol(); } From 33c722fea807939db2dd769331d51f7ab75d6f32 Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Mon, 1 Sep 2025 12:11:22 -0400 Subject: [PATCH 2/4] Update FieldProperty.java --- .../java/io/avaje/jsonb/generator/FieldProperty.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/jsonb-generator/src/main/java/io/avaje/jsonb/generator/FieldProperty.java b/jsonb-generator/src/main/java/io/avaje/jsonb/generator/FieldProperty.java index 805cb1c8..a870110e 100644 --- a/jsonb-generator/src/main/java/io/avaje/jsonb/generator/FieldProperty.java +++ b/jsonb-generator/src/main/java/io/avaje/jsonb/generator/FieldProperty.java @@ -160,8 +160,13 @@ private String initShortName() { return Util.initLower(genericType.shortName()) + "JsonAdapter"; } - String typeParamToObject(String shortType) { + String typeParamToObject() { + var shortType = genericType.shortType(); + for (final String typeParam : genericTypeParams) { + if (shortType.equals(typeParam)) { + return "Object"; + } if (shortType.contains("<" + typeParam + ">")) { shortType = shortType.replace("<" + typeParam + ">", ""); } @@ -280,7 +285,7 @@ void writeFromJsonVariables(Append writer, String num) { if (unmapped) { return; } - final String shortType = typeParamToObject(genericType.shortType()); + final String shortType = typeParamToObject(); writer.append(" %s _val$%s = %s;", pad(shortType), fieldName + num, defaultValue); if (!constructorParam && !optional) { writer.append(" boolean _set$%s = false;", fieldName + num); @@ -289,7 +294,7 @@ void writeFromJsonVariables(Append writer, String num) { } void writeFromJsonVariablesRecord(Append writer, String num) { - final String type = typeParamToObject(genericType.shortType()); + final String type = typeParamToObject(); writer.append(" %s _val$%s = %s;", pad(type), fieldName + num, defaultValue).eol(); } From e370a6660537df1d4460814515e5e0341d7228b7 Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Mon, 1 Sep 2025 12:13:14 -0400 Subject: [PATCH 3/4] Update MyListWrapperRecordTest.java --- .../org/example/customer/generics/MyListWrapperRecordTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/blackbox-test/src/test/java/org/example/customer/generics/MyListWrapperRecordTest.java b/blackbox-test/src/test/java/org/example/customer/generics/MyListWrapperRecordTest.java index 07184dfc..ae587272 100644 --- a/blackbox-test/src/test/java/org/example/customer/generics/MyListWrapperRecordTest.java +++ b/blackbox-test/src/test/java/org/example/customer/generics/MyListWrapperRecordTest.java @@ -29,7 +29,8 @@ void toJson() { assertThat(asJson) .isEqualTo("{\"list\":[{\"id\":90,\"street\":\"one\"},{\"id\":91,\"street\":\"two\"}]}"); - var jsonOfParams = jsonb.type(Types.newParameterizedType(MyListWrapper.class, Address.class)); + var jsonOfParams = + jsonb.type(Types.newParameterizedType(MyListWrapperRecord.class, Address.class)); var wrapper = (MyListWrapperRecord
) jsonOfParams.fromJson(asJson); assertThat(wrapper.list()).hasSize(2); From 4080866ab2e5ee2bec34056358e4eeb54350cb1e Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Tue, 2 Sep 2025 08:59:35 +1200 Subject: [PATCH 4/4] Format only - whitespace --- .../src/main/java/io/avaje/jsonb/generator/FieldProperty.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/jsonb-generator/src/main/java/io/avaje/jsonb/generator/FieldProperty.java b/jsonb-generator/src/main/java/io/avaje/jsonb/generator/FieldProperty.java index a870110e..efd8207c 100644 --- a/jsonb-generator/src/main/java/io/avaje/jsonb/generator/FieldProperty.java +++ b/jsonb-generator/src/main/java/io/avaje/jsonb/generator/FieldProperty.java @@ -162,7 +162,6 @@ private String initShortName() { String typeParamToObject() { var shortType = genericType.shortType(); - for (final String typeParam : genericTypeParams) { if (shortType.equals(typeParam)) { return "Object"; @@ -174,7 +173,6 @@ String typeParamToObject() { return shortType; } - boolean typeObjectBooleanWithIsPrefix() { return nameHasIsPrefix() && isObjectBoolean(); }