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

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


The following commit(s) were added to refs/heads/main by this push:
     new 2c912cd18 fix(java): Encoders.mapEncoder(TypeRef, TypeRef, TypeRef, 
Fory) should load bean classes (#2494)
2c912cd18 is described below

commit 2c912cd187595d88e19a329a4548597e9351a5ad
Author: Steven Schlansker <[email protected]>
AuthorDate: Thu Aug 21 00:03:06 2025 -0700

    fix(java): Encoders.mapEncoder(TypeRef, TypeRef, TypeRef, Fory) should load 
bean classes (#2494)
    
    We dynamically select the key and value type, and tried using this
    overload of Encoders.mapEncoder
    With the single-arg mapEncoder invocation, bean codec classes are loaded
    with `token4BeanLoad`
    
    But this overload never loads the bean classes leading to unexpected
    exceptions during Map codec compile since bean codecs are not loaded
---
 .../org/apache/fory/format/encoder/Encoders.java    | 21 ++++++++++++++++++++-
 .../apache/fory/format/encoder/MapEncoderTest.java  | 18 ++++++++++++++++--
 2 files changed, 36 insertions(+), 3 deletions(-)

diff --git 
a/java/fory-format/src/main/java/org/apache/fory/format/encoder/Encoders.java 
b/java/fory-format/src/main/java/org/apache/fory/format/encoder/Encoders.java
index 18845507b..522f54b27 100644
--- 
a/java/fory-format/src/main/java/org/apache/fory/format/encoder/Encoders.java
+++ 
b/java/fory-format/src/main/java/org/apache/fory/format/encoder/Encoders.java
@@ -474,7 +474,7 @@ public class Encoders {
     TypeRef<?> keyToken = token4BeanLoad(set1, tuple2.f0);
     TypeRef<?> valToken = token4BeanLoad(set2, tuple2.f1);
 
-    MapEncoder<T> encoder = mapEncoder(token, keyToken, valToken, fory);
+    MapEncoder<T> encoder = mapEncoder0(token, keyToken, valToken, fory);
     return createMapEncoder(encoder);
   }
 
@@ -495,6 +495,22 @@ public class Encoders {
     Preconditions.checkNotNull(keyToken);
     Preconditions.checkNotNull(valToken);
 
+    Set<TypeRef<?>> set1 = beanSet(keyToken);
+    Set<TypeRef<?>> set2 = beanSet(valToken);
+    LOG.info("Find beans to load: {}, {}", set1, set2);
+
+    token4BeanLoad(set1, keyToken);
+    token4BeanLoad(set2, valToken);
+
+    return mapEncoder0(mapToken, keyToken, valToken, fory);
+  }
+
+  private static <T extends Map, K, V> MapEncoder<T> mapEncoder0(
+      TypeRef<? extends Map> mapToken, TypeRef<K> keyToken, TypeRef<V> 
valToken, Fory fory) {
+    Preconditions.checkNotNull(mapToken);
+    Preconditions.checkNotNull(keyToken);
+    Preconditions.checkNotNull(valToken);
+
     Schema schema = TypeInference.inferSchema(mapToken, false);
     Field field = DataTypes.fieldOfSchema(schema, 0);
     Field keyField = DataTypes.keyArrayFieldForMap(field);
@@ -685,6 +701,9 @@ public class Encoders {
         TypeUtils.listBeansRecursiveInclusive(
             beanClass,
             new 
TypeResolutionContext(CustomTypeEncoderRegistry.customTypeHandler(), true));
+    if (classes.isEmpty()) {
+      return null;
+    }
     LOG.info("Create RowCodec for classes {}", classes);
     CompileUnit[] compileUnits =
         classes.stream()
diff --git 
a/java/fory-format/src/test/java/org/apache/fory/format/encoder/MapEncoderTest.java
 
b/java/fory-format/src/test/java/org/apache/fory/format/encoder/MapEncoderTest.java
index cf40f70ac..3b0fdea73 100644
--- 
a/java/fory-format/src/test/java/org/apache/fory/format/encoder/MapEncoderTest.java
+++ 
b/java/fory-format/src/test/java/org/apache/fory/format/encoder/MapEncoderTest.java
@@ -134,9 +134,9 @@ public class MapEncoderTest {
   @Test
   public void testKVStructMap() {
     Map<SimpleFoo, SimpleFoo> map = ImmutableMap.of(SimpleFoo.create(), 
SimpleFoo.create());
-    MapEncoder encoder = Encoders.mapEncoder(new TypeRef<Map<SimpleFoo, 
SimpleFoo>>() {});
+    var encoder = Encoders.mapEncoder(new TypeRef<Map<SimpleFoo, SimpleFoo>>() 
{});
     testStreamingEncode(encoder, map);
-    MapEncoder encoder1 = Encoders.mapEncoder(new TypeRef<Map<Foo, Foo>>() {});
+    var encoder1 = Encoders.mapEncoder(new TypeRef<Map<Foo, Foo>>() {});
     testStreamingEncode(encoder1, ImmutableMap.of(Foo.create(), Foo.create()));
   }
 
@@ -192,4 +192,18 @@ public class MapEncoderTest {
 
     testStreamingEncode(encoder, lmap);
   }
+
+  @Test
+  public <K, V> void testDynamicTypeDeclaration() {
+    Encoders.mapEncoder(
+            new TypeRef<HashMap<Integer, Bean>>() {},
+            TypeRef.of(Integer.class),
+            TypeRef.of(Bean.class),
+            null)
+        .encode(new HashMap<>());
+  }
+
+  public static class Bean {
+    int f1;
+  }
 }


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

Reply via email to