diff --git a/blackbox-test/src/main/java/org/example/customer/generics/GMS.java b/blackbox-test/src/main/java/org/example/customer/generics/GMS.java new file mode 100644 index 00000000..790418a7 --- /dev/null +++ b/blackbox-test/src/main/java/org/example/customer/generics/GMS.java @@ -0,0 +1,14 @@ +package org.example.customer.generics; + +import io.avaje.jsonb.Json; + +public class GMS { + + public static class Weaver { + + @Json + public static class Hornet { + public T value; + } + } +} diff --git a/blackbox-test/src/test/java/org/example/customer/generics/NestedClassGenericTest.java b/blackbox-test/src/test/java/org/example/customer/generics/NestedClassGenericTest.java new file mode 100644 index 00000000..ddec7841 --- /dev/null +++ b/blackbox-test/src/test/java/org/example/customer/generics/NestedClassGenericTest.java @@ -0,0 +1,61 @@ +package org.example.customer.generics; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.LinkedHashMap; + +import org.example.customer.Address; +import org.example.customer.generics.GMS.Weaver.Hornet; +import org.junit.jupiter.api.Test; + +import io.avaje.jsonb.JsonType; +import io.avaje.jsonb.Jsonb; +import io.avaje.jsonb.Types; + +class NestedClassGenericTest { + + Jsonb jsonb = Jsonb.instance(); + + private static Hornet
createTestData() { + var bean = new Hornet
(); + bean.value = new Address(90L, "one"); + return bean; + } + + @SuppressWarnings({"rawtypes"}) + @Test + void toJson() { + var bean = createTestData(); + + var type = jsonb.type(Hornet.class); + + String asJson = type.toJson(bean); + assertThat(asJson).isEqualTo("{\"value\":{\"id\":90,\"street\":\"one\"}}"); + assertThat(jsonb.toJson(bean)).isEqualTo(asJson); + + var pageResult = type.fromJson(asJson); + Object document = pageResult.value; + // reading via Object means the list contains LinkedHashMap + assertThat(document).isInstanceOf(LinkedHashMap.class); + LinkedHashMap asMap = (LinkedHashMap) document; + assertThat(asMap.get("street")).isEqualTo("one"); + } + + @Test + void toJson_withGenericParam() { + var bean = createTestData(); + + JsonType> type = + jsonb.type(Types.newParameterizedType(Hornet.class, Address.class)); + + String asJson = type.toJson(bean); + assertThat(asJson).isEqualTo("{\"value\":{\"id\":90,\"street\":\"one\"}}"); + assertThat(jsonb.toJson(bean)).isEqualTo(asJson); + + var genericResult = type.fromJson(asJson); + Address document = genericResult.value; + + assertThat(document.getId()).isEqualTo(90L); + assertThat(document.getStreet()).isEqualTo("one"); + } +} diff --git a/jsonb-generator/src/main/java/io/avaje/jsonb/generator/SimpleAdapterWriter.java b/jsonb-generator/src/main/java/io/avaje/jsonb/generator/SimpleAdapterWriter.java index f949428b..b89129e0 100644 --- a/jsonb-generator/src/main/java/io/avaje/jsonb/generator/SimpleAdapterWriter.java +++ b/jsonb-generator/src/main/java/io/avaje/jsonb/generator/SimpleAdapterWriter.java @@ -57,7 +57,7 @@ void write() throws IOException { private void writeFactory() { if (genericParamsCount > 0) { String typeName = adapterShortName; - final int nestedIndex = adapterShortName.indexOf("$"); + final int nestedIndex = adapterShortName.lastIndexOf("$"); if (nestedIndex != -1) { typeName = typeName.substring(nestedIndex + 1); } diff --git a/jsonb-generator/src/test/java/io/avaje/jsonb/generator/models/valid/GMS.java b/jsonb-generator/src/test/java/io/avaje/jsonb/generator/models/valid/GMS.java new file mode 100644 index 00000000..20d7bea1 --- /dev/null +++ b/jsonb-generator/src/test/java/io/avaje/jsonb/generator/models/valid/GMS.java @@ -0,0 +1,14 @@ +package io.avaje.jsonb.generator.models.valid; + +import io.avaje.jsonb.Json; + +public class GMS { + + public static class Weaver { + + @Json + public static class Hornet { + public T value; + } + } +}