This is an automated email from the ASF dual-hosted git repository.

chaokunyang pushed a commit to branch releases-0.12
in repository https://gitbox.apache.org/repos/asf/fory.git

commit 90ee6fcb2e095fe0f26f800377570c7c14c05db7
Author: chaokunyang <[email protected]>
AuthorDate: Fri Sep 19 20:15:12 2025 +0800

    fix get nested genericTypeInStruct
---
 .../org/apache/fory/resolver/ClassResolver.java    | 13 ++---------
 .../java/org/apache/fory/type/GenericType.java     |  4 ++++
 .../main/java/org/apache/fory/type/TypeUtils.java  | 26 ++++++++++++++++++++++
 .../serializer/collection/MapSerializersTest.java  | 26 ++++++++++++++++++++++
 4 files changed, 58 insertions(+), 11 deletions(-)

diff --git 
a/java/fory-core/src/main/java/org/apache/fory/resolver/ClassResolver.java 
b/java/fory-core/src/main/java/org/apache/fory/resolver/ClassResolver.java
index 471a6069e..11c43233f 100644
--- a/java/fory-core/src/main/java/org/apache/fory/resolver/ClassResolver.java
+++ b/java/fory-core/src/main/java/org/apache/fory/resolver/ClassResolver.java
@@ -2067,17 +2067,8 @@ public class ClassResolver implements TypeResolver {
   @CodegenInvoke
   public GenericType getGenericTypeInStruct(Class<?> cls, String 
genericTypeStr) {
     Map<String, GenericType> map =
-        extRegistry.classGenericTypes.computeIfAbsent(cls, k -> new 
HashMap<>());
-    GenericType genericType = map.get(genericTypeStr);
-    if (genericType == null) {
-      for (Field field : ReflectionUtils.getFields(cls, true)) {
-        Type type = field.getGenericType();
-        TypeRef<Object> typeRef = TypeRef.of(type);
-        genericType = buildGenericType(typeRef);
-        map.put(type.getTypeName(), genericType);
-      }
-    }
-    return genericType;
+        extRegistry.classGenericTypes.computeIfAbsent(cls, 
TypeUtils::buildGenericMap);
+    return map.get(genericTypeStr);
   }
 
   @Override
diff --git a/java/fory-core/src/main/java/org/apache/fory/type/GenericType.java 
b/java/fory-core/src/main/java/org/apache/fory/type/GenericType.java
index f5e7333f4..36c9a3eb7 100644
--- a/java/fory-core/src/main/java/org/apache/fory/type/GenericType.java
+++ b/java/fory-core/src/main/java/org/apache/fory/type/GenericType.java
@@ -166,6 +166,10 @@ public class GenericType {
     return typeRef;
   }
 
+  public Type getType() {
+    return typeRef.getType();
+  }
+
   public Class<?> getCls() {
     return cls;
   }
diff --git a/java/fory-core/src/main/java/org/apache/fory/type/TypeUtils.java 
b/java/fory-core/src/main/java/org/apache/fory/type/TypeUtils.java
index 2095d2000..b47a45419 100644
--- a/java/fory-core/src/main/java/org/apache/fory/type/TypeUtils.java
+++ b/java/fory-core/src/main/java/org/apache/fory/type/TypeUtils.java
@@ -909,4 +909,30 @@ public class TypeUtils {
           return false;
         });
   }
+
+  /**
+   * Build a map of nested generic type name to generic type for all fields in 
the class.
+   *
+   * @param cls the class to build the map of nested generic type name to 
generic type for all
+   *     fields in the class
+   * @return a map of nested generic type name to generic type for all fields 
in the class
+   */
+  public static Map<String, GenericType> buildGenericMap(Class<?> cls) {
+    Map<String, GenericType> map = new HashMap<>();
+    for (Field field : ReflectionUtils.getFields(cls, true)) {
+      Type type = field.getGenericType();
+      GenericType genericType = GenericType.build(type);
+      if (map.containsKey(type.getTypeName())) {
+        continue;
+      }
+      map.put(type.getTypeName(), genericType);
+      for (GenericType t : genericType.getTypeParameters()) {
+        if (map.containsKey(t.getType().getTypeName())) {
+          continue;
+        }
+        map.put(t.getType().getTypeName(), GenericType.build(t.getType()));
+      }
+    }
+    return map;
+  }
 }
diff --git 
a/java/fory-core/src/test/java/org/apache/fory/serializer/collection/MapSerializersTest.java
 
b/java/fory-core/src/test/java/org/apache/fory/serializer/collection/MapSerializersTest.java
index b19b76e26..4e00a7953 100644
--- 
a/java/fory-core/src/test/java/org/apache/fory/serializer/collection/MapSerializersTest.java
+++ 
b/java/fory-core/src/test/java/org/apache/fory/serializer/collection/MapSerializersTest.java
@@ -1048,4 +1048,30 @@ public class MapSerializersTest extends ForyTestBase {
     State state2 = (State) fory2.deserialize(bytes);
     Assert.assertEquals(state2.map.get("bar"), new String[] {"bar"});
   }
+
+  @Data
+  public static class OuterClass {
+    private Map<String, InnerClass> f1 = new HashMap<>();
+    private TestEnum f2;
+  }
+
+  @Data
+  public static class InnerClass {
+    int f1;
+  }
+
+  @Test(dataProvider = "compatible")
+  public void testNestedMapGenericCodegen(boolean compatible) {
+    Fory fory =
+        builder()
+            .withCodegen(true)
+            .withCompatibleMode(
+                compatible ? CompatibleMode.COMPATIBLE : 
CompatibleMode.SCHEMA_CONSISTENT)
+            .requireClassRegistration(false)
+            .build();
+
+    OuterClass value = new OuterClass();
+    value.f1.put("aaa", null);
+    serDeCheck(fory, value);
+  }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to