Skip to content

Commit fca862c

Browse files
authored
fix nested generic classes (#441)
1 parent 4a0ce8d commit fca862c

File tree

4 files changed

+90
-1
lines changed

4 files changed

+90
-1
lines changed
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package org.example.customer.generics;
2+
3+
import io.avaje.jsonb.Json;
4+
5+
public class GMS {
6+
7+
public static class Weaver {
8+
9+
@Json
10+
public static class Hornet<T> {
11+
public T value;
12+
}
13+
}
14+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package org.example.customer.generics;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
5+
import java.util.LinkedHashMap;
6+
7+
import org.example.customer.Address;
8+
import org.example.customer.generics.GMS.Weaver.Hornet;
9+
import org.junit.jupiter.api.Test;
10+
11+
import io.avaje.jsonb.JsonType;
12+
import io.avaje.jsonb.Jsonb;
13+
import io.avaje.jsonb.Types;
14+
15+
class NestedClassGenericTest {
16+
17+
Jsonb jsonb = Jsonb.instance();
18+
19+
private static Hornet<Address> createTestData() {
20+
var bean = new Hornet<Address>();
21+
bean.value = new Address(90L, "one");
22+
return bean;
23+
}
24+
25+
@SuppressWarnings({"rawtypes"})
26+
@Test
27+
void toJson() {
28+
var bean = createTestData();
29+
30+
var type = jsonb.type(Hornet.class);
31+
32+
String asJson = type.toJson(bean);
33+
assertThat(asJson).isEqualTo("{\"value\":{\"id\":90,\"street\":\"one\"}}");
34+
assertThat(jsonb.toJson(bean)).isEqualTo(asJson);
35+
36+
var pageResult = type.fromJson(asJson);
37+
Object document = pageResult.value;
38+
// reading via Object means the list contains LinkedHashMap
39+
assertThat(document).isInstanceOf(LinkedHashMap.class);
40+
LinkedHashMap asMap = (LinkedHashMap) document;
41+
assertThat(asMap.get("street")).isEqualTo("one");
42+
}
43+
44+
@Test
45+
void toJson_withGenericParam() {
46+
var bean = createTestData();
47+
48+
JsonType<Hornet<Address>> type =
49+
jsonb.type(Types.newParameterizedType(Hornet.class, Address.class));
50+
51+
String asJson = type.toJson(bean);
52+
assertThat(asJson).isEqualTo("{\"value\":{\"id\":90,\"street\":\"one\"}}");
53+
assertThat(jsonb.toJson(bean)).isEqualTo(asJson);
54+
55+
var genericResult = type.fromJson(asJson);
56+
Address document = genericResult.value;
57+
58+
assertThat(document.getId()).isEqualTo(90L);
59+
assertThat(document.getStreet()).isEqualTo("one");
60+
}
61+
}

jsonb-generator/src/main/java/io/avaje/jsonb/generator/SimpleAdapterWriter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ void write() throws IOException {
5757
private void writeFactory() {
5858
if (genericParamsCount > 0) {
5959
String typeName = adapterShortName;
60-
final int nestedIndex = adapterShortName.indexOf("$");
60+
final int nestedIndex = adapterShortName.lastIndexOf("$");
6161
if (nestedIndex != -1) {
6262
typeName = typeName.substring(nestedIndex + 1);
6363
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package io.avaje.jsonb.generator.models.valid;
2+
3+
import io.avaje.jsonb.Json;
4+
5+
public class GMS {
6+
7+
public static class Weaver {
8+
9+
@Json
10+
public static class Hornet<T> {
11+
public T value;
12+
}
13+
}
14+
}

0 commit comments

Comments
 (0)